目录
Redis事务与MySQL事务区别:
SQL的事务特性ACID(原子、完整、一致性、持久性)
Redis单条命令保证原子性,但是事务不保证原子性!
Redis事务没有隔离级别的概念!
Redis事务本质:
一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程中会按照顺序执行!一次性、顺序性、排他性!执行一系列的命令!
-------队列 set set set 执行 ------
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会被执行!Exec
Redis的事务:
-
开启事务(multi)
-
命令入队(...)
-
执行事务(exec)
-
取消事务(discard)
-
异常
编译型异常(代码有问题!命令有问题!)事务中所有命令都不会被执行!
运行时异常(x/0),其他命令可以正常执行,错误命令抛出异常!
-
监控(面试常问:Redis是否可以做乐观锁?)
悲观锁:
-
认为什么时候都会出问题,无论做什么都加锁!
乐观锁:
-
认为什么时候都不会出问题,所以不加锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据。
-
获取 version
-
更新的时候比较 version
Redis 监控测试:
1、Redis 使用 watch,正常执行成功!
2、多线程修改值,使用watch,可以当作redis的乐观锁!
在线程1exec之前,线程2就开始执行对相同数据的修改操作:
线程1:
线程2:
线程1:这个时候可以先解除监视再重新监视