Redis入门到精通(十三)——事务的基本操作(开启/执行/取消)、事务工作流程、事务的锁、事物的分布式锁(setnx)、事务死锁解锁

什么是事务(Redis中的事务在实际开发中还是用的比较少的)

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰。

一、事务的基本操作

开启事务 
multi        #设定事务的开启位置,此指令执行后,后续的所有指令均加到事务中

执行事务
exec        #设定事务的结束位置,同时执行事务。与multi成对出现,成对使用,最后返回的是每一个命令的返回结果

 

 

注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行

取消事物

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

二、事务的工作流程

 

 

三、事务的注意事项

定义事务过程中,命令格式输入错误怎么办

语法错误:命令书写格式有误   比如设置key是写set,错误写成了tes
处理结果:如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行。包括那些正确的命令。

定义事务的过程中,命令语法执行出现错误怎么办

运行错误:指命令格式正确,但是无法正确的执行。例如对list进行incr操作或者对str类型进行lpush
处理结果:能够正确运行的命令去执行,运行错误的命令不执行

手动进行事务的回滚

 

 

四、事务的锁

 

 

解决方案

对key添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 key2

取消对所有key的监视
unwatch

注意:watch监视要在事务开启之前(multi)设置,如果其他客户端对监视的key做修改,那么exec得到的结果为nil

 

 

五、事务分布式锁

业务场景:超卖问题——基于分布式锁对应的场景控制

 

 

解决方案

使用setnx设置一个公共锁       setnx lock-key value

利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功 (购买之前先判断是否存在库存)
  1.对于返回设置成功的,拥有控制权,进行下一步的具体业务操作:对库存数据增减操作
  2.对于返回值设置失败的,不具有控制权,排队或者等待
操作完毕通过del操作释放锁:del lock-key
lock-key是锁名,value可以随意设置
注意:必须多个客户端同时使用相同的锁名,如果设置上锁,其他客户端再想设置锁的话会失败,需要等待前一个客户端释放锁

 

六、事务死锁解决方案

由于锁操作由用户控制加锁解锁,必定会存在加锁后未解锁的风险。
需要解锁操作不能仅依赖用户控制,系统级别要给出对应的保底处理方案

解决方案

使用expire为锁key添加时间限定,到时间不释放,放弃锁
expire  lock-key  second         #设置时间单位为秒
pexpire lock-key milliseconds     #设置时间为毫秒

 

posted @ 2020-05-16 12:51  只会玩辅助  阅读(683)  评论(0编辑  收藏  举报