Redis事务
Redis事务就是一个命令执行的队列,将一系列预定义命令包装成为一个整体,当执行的时候,一次性按照添加顺序依次执行后,中间不会被打断或者干扰
事务的基本操作
开启事务:multi,设定事务的开始位置,此指令执行后,后续的所有指令均加入到事务中
执行事务:exec,指定事务的结束位置,同时执行事务,与multi成对出现,成对使用
注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才会开始执行
事务定义的过程出现了问题,怎么办???
取消事务:discard,终止当前事务的定义,发生在multi之后,exec之前
事务的工作流程
事务的注意事项
1、定义事务的过程中,命令格式输入错误怎么办
语法错误:指命令书写格式有误
处理结果:如果定义的事务中包含的命令存在语法错误,整体事务中所有命令均不会执行,包括那些语法正确的命令
2、定义事务的过程中,命令执行出现错误怎么办
运行错误:指的是命令格式正确,但是无法正确的执行,例如对list的incr操作
处理结果:能够正确运行的命令会执行,运行错误的命令不会被执行
注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己再代码中实现回滚
锁
1、基于特定条件的事务执行----锁
对key添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 [key2...]
取消对所有key的监视
unwatch
2、基于特定条件的事务执行----分布式锁(解决超卖问题)
使用setnx设置一个公共锁
setnex lock-key value
利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功
- 对于返回设置成功的,拥有控制权,进行下一步的具体业务操作
- 对于返回设置失败的,不具有控制权,排队或者等待
操作完毕通过del操作释放锁
3、基于特定条件的事务执行---分布式改良锁
使用expire为锁key添加时间限定,到时间时不释放锁,放弃锁
expire lock-key second
expire lock-key milliseconds
由于操作通常是微秒或者毫秒级,因此该锁定时间不宜设置过大,具体时间需要业务测试后确认