在说redis的事物之前,说一个小故事
收银员在数钱,一个小孩在唱歌,这时候收银员就不能专心的去数钱了
1.什么是事物?
redis的事物就是一个命令执行的队列,将一系列预的指令包装成为一个整体,当执行的时候,一次性的按照添加的顺序依次执行,中间不会被干扰。
2.事物的操作
开启事物:
multi: 设定事物开启的位置,此指令执行后,后续的所有指令的都会加入到事物中
结束事务:
exec : 设定事物结束的位置,同时执行事物,与multi成对的出现,成对使用
** 加入事物的命令只会存入到任务队列中,并不会立即的去执行,只有执行exec命令才开始执行
取消事物:
discard: 终止当前事物的定义,发生在multi之后,exec之前
3.加入事物操作过程中,输入错误的话怎么办
1.语法错误:
命令书写格式有误,整体的命令都不会执行,包括那些语法正确的命令。
2.命令错误执行: 对list进行incr操作
能够正确运行的命令会执行,运行错误的指令不会被执行
已经执行完成的命令对应的数据不会发生回滚,需要手动进行代码的回滚
手动!!!!
当然是开个玩笑,不过redis中的事物用的很少
业务:
天猫双11热卖过程中,对已经售罄的货物追加补货,4个业务员都有权限进行补货。补货的操作可能是一系
列的操作,牵扯到多个连续操作,如何保障不会重复操作?
分析:
- 多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用于继续操作
- 在操作之前锁定要操作的数据,一旦发生变化,终止当前操作
给key添加锁,每一次使用之前都会监视key
添加锁:
对key添加监视锁,在执行exec前如果key发生了变化,终止事物的执行。
watch key1 {key2}
取消对所有key的监视
unwatch
业务升级:
天猫双11热卖过程中,对已经售罄的货物追加补货,且补货完成。客户购买热情高涨,3秒内将所有商品购
买完毕。本次补货已经将库存全部清空,如何避免最后一件商品不被多人同时购买?【超卖问题】
业务分析:
- 使用watch监控一个key有没有改变已经不能解决问题,此处要监控的是具体数据
- 虽然redis是单线程的,但是多个客户端对同一数据同时进行操作时,如何避免不被同时修改?
解决 :基于特定条件的事物执行----分布式锁
对货物进行设置一个公共的锁
setnx lock-key value
就比如一个公共卫生间锁上一把锁
下一个人来了,会通过setnx命令的返回特征,有锁设置失败,无锁成功,成功了就会有操作权。
del 释放锁
假如卫生间的人睡着了呢???
外面的人就会一直等待
解决这个问题就是给锁设置一个实效时间,到时间之后释放锁,
expire look-key second