系列文章目录
Redis入门笔记(一):Redis在Linux下安装和八大数据类型
文章目录
- 系列文章目录
- 前言
- Redis对事务进行操作
- 开启事务:`multi`
- 执行事务:`exec`
- 放弃事务:`discard`
- 编译型异常(命令错误)事务中所有命令都不会执行
- 运行时异常(其他命令依然正常运行)
- 悲观锁与乐观锁
- redis的`watch`自带悲观锁
- 使用Java来操作Redis
- 解决Jedis连接失败问题
- Jedis操作事务
前言
Redis事务本质:一组命令的集合
Redis中事务的特性:
Redis的单条命令式保存原子性的,但是事务不保证原子性,
redis事务在执行过程中如果有一条命令执行失败,那么其后的命令仍然可以执行,不会回滚。
事务没有隔离级别的概念。
一个事务中所有的命令都会被序列化,在事务执行过程中,会按照顺序执行,
所有的命令在事务中并没有直接被执行,发起执行时才会执行
Redis对事务进行操作
开启事务:multi
命令式是按照入队的顺序执行的
执行事务:exec
事务在执行一次后,就清空了
放弃事务:discard
编译型异常(命令错误)事务中所有命令都不会执行
运行时异常(其他命令依然正常运行)
incr key 如果key不存在,会默认初始化为0,然后incr加一
虽然第一条命令报错了,但其他命令依然正常执行成功
悲观锁与乐观锁
悲观锁:悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),
所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。
也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。
乐观锁:乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,
- 悲观锁通常多用于写比较多的情况下(多写场景,竞争激烈),这样可以避免频繁失败和重试影响性能,悲观锁的开销是固定的。
- 乐观锁通常多于写比较少的情况下(多读场景,竞争较少),这样可以避免频繁加锁影响性能。不过,乐观锁主要针对的对象是单个共享变量
redis的watch
自带悲观锁
这个是正常执行的输出
在事务未执行前,更改数据
redis 中watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。
unwatch解除监控,重新获值
使用Java来操作Redis
Jedis是Redis官方推荐使用的Java连接redis的客户端。
导依赖:
<!--导入jredis的包-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
测试是否能ping 通
import redis.clients.jedis.Jedis;
public class RedisTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.200.200",6379);
String ping = jedis.ping();
System.out.println(ping);
}
}
解决Jedis连接失败问题
1、关闭防火墙:
systemctl status firewalld
查看防火墙的状态
systemctl stop firewalld
关闭防火墙
2、确认linux和windows能够ping通
如果还报错
3、修改redis.conf
默认条件下bind 127.0.0.1只接受本机访问
protected-mode在开启的情况下,如果没有设定bind和密码,只接受本机的访问。
通了!
Jedis操作事务
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
public class RedisTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.31.238",6379);
jedis.flushDB();
JSONObject jsonObject = new JSONObject();
jsonObject.put("hello", "world");
jsonObject.put("name", "liu heng");
// 开启事务
Transaction multi = jedis.multi();
String result = jsonObject.toJSONString();
// jedis.watch(result)
try {
multi.set("user1", result);
multi.set("user2", result);
// 执行事务
multi.exec();
}catch (Exception e){
// 放弃事务
multi.discard();
} finally {
// 关闭连接
System.out.println(jedis.get("user1"));
System.out.println(jedis.get("user2"));
jedis.close();
}
}
}