redis(四)事务

简介

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

基本操作

1.指令

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

exec 执行事务 设定事务的结束位置,同事执行事务,与multi成对出现,成对使用

discard 取消事务 终止当前事务,发生在multi之后,exec之前
image

image

2.工作流程

image

3.注意事项

1.定义事务的过程中,命令输入错误以后整体事务均不执行,包括正确的命令

image

2.定义事务的过程中,命令执行出现错误时(如操作了一个不能操作的类型)只有运行错误的命令不执行,正确的执行

image

多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用与继续操作

在操作之前需要锁定要操作的数据,一旦发生变化,终止当前操作

1.锁

watch key1 [key2] -->对key添加监视,并在执行exec钱如果key发生了变化,终止事务执行

unwatch 取消对所有key的监视
image

上图可见当监视name开启事务执行操作未结束之前,修改name的值导致事务未执行

2.分布式锁(解决超卖问题)

setnx lock-key value
image

利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功

​ 1.对于返回成功的拥有控制权,可以进行下一步的具体业务操作

​ 2.对于返回失败的,没有控制权,排队、等待

操作完毕通过del操作释放锁

存在的问题是:当依赖分布式锁时,如果某个机器停机了,且此时已经获取到锁,就没办法释放了

3.分布式锁改良

expire lock-key second

pexpire lock-key milliseconds
image

由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大。具体时间需要业务测试后确认。

			1. 例如:持有锁的操作最长执行时间127ms,最短执行时间7ms。

  				2. 测试百万次最长执行时间对应命令的最大耗时,测试百万次网络延迟平均耗时
                     				3. 锁时间设定推荐:最大耗时*120%+平均网络延迟*110% 
              				4. 如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可 
posted @ 2021-06-11 13:23  zhao56  阅读(29)  评论(0编辑  收藏  举报