事务
注意:Redis单条命令是保证原子性的;但是事务不保证原子性!
Redis事务没有隔离级别的概念,所有的命令在事务中,并没有直接被执行,只有发起执行命令时才执行
Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!
Redis的事务流程:
- 开启事务(
multi
) - 命令入队(
其他命令
) - 执行事务(
exec
)
正常执行事务
取消事务
discard
异常执行
1. 编译时出现异常(命令写错)
整个命令队列都不会执行
2. 运行时出现异常(语法错误)
报错语句,会抛出异常;其他语句照样运行
监控 Watch(面试常问)
乐观锁:实现秒杀
- 顾名思义,很乐观,认为什么时候都不会出现问题,所以不会加锁!(更新数据的时候去判断一下,在此期间是否有人修改过这个数据)
- 获取version
- 更新的时候比较version
悲观锁
- 顾名思义,很悲观,认为什么时候都会出现问题,无论做什么都会加锁!
Redis 实现乐观锁
测试多线程修改值,使用 watch 可以当作 Redis 的乐观锁操作
演示
①开启俩个,客户端,模拟多线程情况
②左边支出20元(但是不执行事务),然后右边修改money的数值
③左边执行事务,发现执行操作返回nil,查看money和out,发现事务并没有被执行(确实有乐观锁的效果)
如果修改失败获取最新的值就好(exec
、unwatch
、discard
都可以清除连接时所有的监视)
小结
- 使用 Redis 实现乐观锁(watch 监听某一个 key,获取其最新的 value)
- 在提交事务时,如果 key 的 value 没有发生变化,则成功执行
- 在提交事务时,如果 key 的 value 发生了变化,则无法成功执行