在说redis的事物之前,说一个小故事
Redis的事物-----详解
收银员在数钱,一个小孩在唱歌,这时候收银员就不能专心的去数钱了

1.什么是事物?

redis的事物就是一个命令执行的队列,将一系列预的指令包装成为一个整体,当执行的时候,一次性的按照添加的顺序依次执行,中间不会被干扰。

2.事物的操作

开启事物:

multi: 设定事物开启的位置,此指令执行后,后续的所有指令的都会加入到事物中

结束事务:

exec : 设定事物结束的位置,同时执行事物,与multi成对的出现,成对使用

** 加入事物的命令只会存入到任务队列中,并不会立即的去执行,只有执行exec命令才开始执行

取消事物:

discard: 终止当前事物的定义,发生在multi之后,exec之前

3.加入事物操作过程中,输入错误的话怎么办

Redis的事物-----详解

1.语法错误:

命令书写格式有误,整体的命令都不会执行,包括那些语法正确的命令。

2.命令错误执行: 对list进行incr操作

能够正确运行的命令会执行,运行错误的指令不会被执行

已经执行完成的命令对应的数据不会发生回滚,需要手动进行代码的回滚

手动!!!!

Redis的事物-----详解
当然是开个玩笑,不过redis中的事物用的很少

业务:

天猫双11热卖过程中,对已经售罄的货物追加补货,4个业务员都有权限进行补货。补货的操作可能是一系
列的操作,牵扯到多个连续操作,如何保障不会重复操作?

分析:

  • 多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用于继续操作
  • 在操作之前锁定要操作的数据,一旦发生变化,终止当前操作

给key添加锁,每一次使用之前都会监视key

添加锁:

对key添加监视锁,在执行exec前如果key发生了变化,终止事物的执行。

watch key1 {key2}

取消对所有key的监视

unwatch

业务升级:

天猫双11热卖过程中,对已经售罄的货物追加补货,且补货完成。客户购买热情高涨,3秒内将所有商品购
买完毕。本次补货已经将库存全部清空,如何避免最后一件商品不被多人同时购买?【超卖问题】

业务分析:

  • 使用watch监控一个key有没有改变已经不能解决问题,此处要监控的是具体数据
  • 虽然redis是单线程的,但是多个客户端对同一数据同时进行操作时,如何避免不被同时修改?

解决 :基于特定条件的事物执行----分布式锁

对货物进行设置一个公共的锁

setnx lock-key value

就比如一个公共卫生间锁上一把锁
Redis的事物-----详解
下一个人来了,会通过setnx命令的返回特征,有锁设置失败,无锁成功,成功了就会有操作权。

del 释放锁

假如卫生间的人睡着了呢???

Redis的事物-----详解
外面的人就会一直等待

解决这个问题就是给锁设置一个实效时间,到时间之后释放锁,

expire look-key second

相关文章: