Redis事务简介
redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰,一个队列,一次性,顺序性,排他性的执行一系列命令
事务的基本操作
- 开启事务
multi
设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中- 执行事务
exec
设定事务的结束位置,同时执行事务。与multi成对出现,成对使用- 取消事务
discard
终止当前事务的定义,发生在multi之后,在exec之前
事务的工作流程
事务的注意事项
- 定义事务的过程中,命令格式输入错误
如果定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行,包括那些正确的命令- 定义事务的过程中,命令执行出现错误
正确运行的命令会执行,错误的命令不会被执行- 已经执行完毕的命令对应得到数据不会自动回滚,需要程序员自己在程序中实现回滚
Redis事务-锁
- 对key添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 [key2 ...] - 取消对所有key的监视
unwatch
应用场景
应用于基于状态控制的批量任务执行
Redis事务-分布式锁
setnx lock-key value
使用setnx设置一个公共锁,利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功;对于设置成功的,拥有控制权,进行下一步的具体业务操作;对于返回设置失败的,不具有控制权,排队或等待;操作完毕之后通过del操作释放锁
应用场景
应用于基于分布式锁对应的场景控制
Redis事务-死锁
- 由于锁操作是由用户控制加锁解锁,必定会存在加锁后未解锁的风险
- 需要解锁操作不能仅依赖用户控制,系统级别要给出对应的保底处理方案
解决方案
使用expire为锁key添加时间限定,到期不释放则放弃锁
expire lock-key secondpexpire lock-key milliseconds
锁时间设定推荐: 执行业务最大耗时*120% + 平均网络延迟 * 110%