什么是事务
redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照顺序依次执行,中间不会被打断。
一个队列中,一次性、顺序性、排他性的执行一系列命令
- 事务的基本操作:
- 开启事务(事务的开启位置)
multi
- 执行事务(事务的结束位置)
exec
- 取消事务
discard
加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行
- 例子
- 用户1先设置num=10,然后开启事务,并重新设置num=5,此时用户1还没有提交事务
- 此时用户2对num设置为19,此时用户1还没有提交事务
- 此时用户1提交事务,再get num时值就变成了5,而不是19,然后在用户2中值也变成了5(这里就体现出事务的回滚)
基于特定条件的事务执行——分布式锁
- 使用setnx设置一个公共锁
setnx lock-key value
- 使用expire为锁key添加时间限定
expire lock-key second
|pexpire lock-key milliseconds
业务场景
京东在618活动中,客户购买热情高涨,不一会儿就将所有商品购买完毕,如何避免最后一件商品不被多人同时购买(超卖问题),并且如果最后一个商品被别人买了会提示要在30分钟内付款,否则会取消订单,这样其他抢购的人会在页面上显示你还有机会,当前还有人未付款。
1) 用户1抢购到该商品
2) 由于此时给该商品加锁,因此用户2无法进行购买,只有解锁才可以进行操作