redis(四)事务
简介
redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个队列,当执行时,按照顺序依次执行,中间不会被打断或者干扰
基本操作
1.指令
multi 开启事务 设定事务的开始位置,此指令执行后,后续的所有指令均加入到事务中去
exec 执行事务 设定事务的结束位置,同事执行事务,与multi成对出现,成对使用
discard 取消事务 终止当前事务,发生在multi之后,exec之前
2.工作流程
3.注意事项
1.定义事务的过程中,命令输入错误以后整体事务均不执行,包括正确的命令
2.定义事务的过程中,命令执行出现错误时(如操作了一个不能操作的类型)只有运行错误的命令不执行,正确的执行
锁
多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用与继续操作
在操作之前需要锁定要操作的数据,一旦发生变化,终止当前操作
1.锁
watch key1 [key2] -->对key添加监视,并在执行exec钱如果key发生了变化,终止事务执行
unwatch 取消对所有key的监视
上图可见当监视name开启事务执行操作未结束之前,修改name的值导致事务未执行
2.分布式锁(解决超卖问题)
setnx lock-key value
利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功
1.对于返回成功的拥有控制权,可以进行下一步的具体业务操作
2.对于返回失败的,没有控制权,排队、等待
操作完毕通过del操作释放锁
存在的问题是:当依赖分布式锁时,如果某个机器停机了,且此时已经获取到锁,就没办法释放了
3.分布式锁改良
expire lock-key second
pexpire lock-key milliseconds
由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大。具体时间需要业务测试后确认。
1. 例如:持有锁的操作最长执行时间127ms,最短执行时间7ms。
2. 测试百万次最长执行时间对应命令的最大耗时,测试百万次网络延迟平均耗时
3. 锁时间设定推荐:最大耗时*120%+平均网络延迟*110%
4. 如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可
本文来自博客园,作者:zhao56,转载请注明原文链接:https://www.cnblogs.com/zhao56/p/14874297.html