Redis事务

Redis事务就是将一组指令放入一个队列,当执行时,按照添加顺序依次执行,不被其他线程的指令干扰,可能会有人说了,Redis不是单线程的吗?为什么会存在并发问题呢?Reids是单线程的没错,但是会有多个客户端连接Redis,每个客户端会有一个线程,会形成竞争

开启事务:此命令执行后,后续所有的指令都加入到事务中

multi

执行事务:设置事务结束的位置,同时执行事务,与multi成对使用

exec

注意:加入事务的命令没有立即执行,只有执行exec命令才会统一执行并返回结果

取消事务:终止当前事务的定义,发生在multi后,exec之前,如果发现命令写错了可以执行该命令

discard

事务的执行流程:

Redis事务

事务注意事项:

  • 如果命令不正确,那么所有的指令将都不执行
  • 如果运行中出现错误,那么只会运行正确的命令,错误的命令不会执行
  • 已经执行完毕的命令对应的数据不会回滚

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

相关推荐