Redis 事务详细介绍

Redis的事务不保证原子性,而是一组命令的集合,按顺序执行。乐观锁通过watch命令实现,监控key的变动,在事务执行时若key的value未变则执行,否则失败。在多线程环境下,watch能防止数据冲突,提供了一种无锁解决方案。

事务 

注意:Redis单条命令是保证原子性的;但是事务不保证原子性!

Redis事务没有隔离级别的概念,所有的命令在事务中,并没有直接被执行,只有发起执行命令时才执行

Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!

Redis的事务流程:

  • 开启事务(multi
  • 命令入队(其他命令
  • 执行事务(exec

正常执行事务

取消事务

discard

异常执行

1. 编译时出现异常(命令写错)

整个命令队列都不会执行

2. 运行时出现异常(语法错误)

报错语句,会抛出异常;其他语句照样运行

监控 Watch(面试常问)

乐观锁:实现秒杀

  • 顾名思义,很乐观,认为什么时候都不会出现问题,所以不会加锁!(更新数据的时候去判断一下,在此期间是否有人修改过这个数据)
    • 获取version
    • 更新的时候比较version

悲观锁

  • 顾名思义,很悲观,认为什么时候都会出现问题,无论做什么都会加锁!

Redis 实现乐观锁

执行成功(单线程没有干扰情况)

测试多线程修改值,使用 watch 可以当作 Redis 乐观锁操作

演示

①开启俩个,客户端,模拟多线程情况

②左边支出20元(但是不执行事务),然后右边修改money的数值

③左边执行事务,发现执行操作返回nil,查看money和out,发现事务并没有被执行(确实有乐观锁的效果)

如果修改失败获取最新的值就好(execunwatchdiscard都可以清除连接时所有的监视)

小结

  • 使用 Redis 实现乐观锁(watch 监听某一个 key,获取其最新的 value)
    • 在提交事务时,如果 key 的 value 没有发生变化,则成功执行
    • 在提交事务时,如果 key 的 value 发生了变化,则无法成功执行

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值