manongxiaomei 2020-05-11
Redis事务就是将一组指令放入一个队列,当执行时,按照添加顺序依次执行,不被其他线程的指令干扰,可能会有人说了,Redis不是单线程的吗?为什么会存在并发问题呢?Reids是单线程的没错,但是会有多个客户端连接Redis,每个客户端会有一个线程,会形成竞争
开启事务:此命令执行后,后续所有的指令都加入到事务中
multi
执行事务:设置事务结束的位置,同时执行事务,与multi成对使用
exec
注意:加入事务的命令没有立即执行,只有执行exec命令才会统一执行并返回结果
取消事务:终止当前事务的定义,发生在multi后,exec之前,如果发现命令写错了可以执行该命令
discard
事务的执行流程:
事务注意事项:
watch锁:
多个客户端操作同一个数据 ,但是只希望修改一次,可以在操作之前锁定要操作的数据,一旦发生变化,终止当前操作
对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 [key2……]
取消对所有 key 的监视
unwatch
分布式锁:
超卖问题
watch已经无法解决该问题,因为watch是监控有没有发生改变,而这里是要监控一个值变不变,而不是其他人能不能改这个值
使用setnx设置一个公共锁
setnx lock-key value
利用setnx命令的返回值特征,有值则返回设置失败,无值则设置成功
操作完毕通过del lock-key 释放锁
这种方案是一种设计概念,依赖规范性,需要保证锁是同一个
当某个用户获取到了分布式锁但是这个时候对应的客户端宕机了,怎么解决
解决方案:
使用expire给锁一个时间,如果指定的时间用户没有释放锁,系统就帮它释放
expire local-key seconds pexpire local-key seconds