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 #设置时间为毫秒