开发者学堂课程【Redis 入门到精通(进阶篇):事务-分布式锁】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/765/detail/13435
事务-分布式锁
内容介绍
一、基于特定条件的事务执行
二、基于特定条件的事务执行——分布式锁
一、 基于特定条件的事务执行
业务场景:
天猫双11热卖过程中,对已经售空的货物追加补货,且补货完成。客户购买热情高涨,3秒内将所有商品购买完毕。本次补货已经将库存全部清空,如何避免最后一件商品不被多人同时买?【超卖问题】
业务分析:
1、 使用 watch 监控一个 key 有没有改变已经不能解决问题,此处要监控的是具体数据
用 watch 监控购买数量或库存数量,这是不解决问题的;因为监控的数量值在不停的改变。
2、 redis 是单线程的,多个客户端对于同一数据同时操作 要避免不被同时修改。
二、基于特定条件的事务执行——分布式锁
1、解决方案
(1)、使用 setnx 设置一个公共锁,锁一个对应的 key
setnx lock-key value
利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功。
对于返回设置成功的,拥有控制权,进行下一步的具体业务操作。
对于返回设置失败的,不具有控制权,排队或等待。
操作完毕通过 del 操作释放锁。
(2)、代码演示
清空所有数据后操作数据
127.0.0.1:6379> set num 10
Ok
127.0.0.1:6379> setnx lock num 1
<inleger> 1
//加锁
127.0.0.1:6379> incryby num -1
<inleger> 9
127.0.0.1:6379>del lock num
<inleger> 1
在另外一个客户端下
127.0.0.1:6379> setnx lock num 1
<inleger> 1
注意:上述解决方案是一种设计概念,依赖规范保障,具有风险性
真正操作的是 number,但规定的为锁,前提是必须锁同一把锁,若一个锁 lock number,另一个锁 number lock,那么将会失败。
redis 应用基于分布式锁对应的场景控制。