Redis事务
Posted 即使再小的帆也能远航!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis事务相关的知识,希望对你有一定的参考价值。
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
以上是关于Redis事务的主要内容,如果未能解决你的问题,请参考以下文章