Redis 事务
Redis 事务
Redis事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行执行队列中的命令,其他客户提交的命令请求不会插入到事务执行命令序列中(不能加塞)。
什么事Redis事务
Redis 事务就是一次性、顺序性、排他性的执行一个队列中的一系列命名。
Redis事务相关命令
MULTI: 开启事务,redis会将后续的命令逐个放入队列中
EXEX: 执行事务中的所有操作命令
DISCARD: 取消事务,放弃执行事务块中的所有命令
WATCH: 监视一个或多个key,如果事务在执行前,这个key(或者多个key)被其他命令修改,则事务终端,不会执行事务的任何命令
UNWATCH:取消WATCH对所有key的监视
事务正常执行
事务取消
事务错误处理
语法错误(编译器错误)
开启事务后,修改k1、k2的值,由于k2语法错误,事务提交失败k1、k2保留原值(全体连坐)
Redis类型错误(运行时错误)
开启事务后,修改k1、k2的值,由于将k2的类型作为List,在运行时检测类型错误,最终导致事务提交失败,此时事务并没有回滚,而是跳过错误命令继续执行, 结果k1值改变、k2保留原值(冤头债主)
WATCH监控
WATCH命令可以为Redis事务提供 check-and-set(CAS)行为。
被WATCH的键会被监视,并会发觉这些键是否被改动过。如果有至少一个监视器的键在EXEC执行之前被修改,那么整个事务都会被取消,EXEC返回nil-reply来表示事务已经失败。
举个🌰
watch监视
UNWATCH 取消监视
小结
一旦执行了EXEC 之后之前加的监控锁都会被取消掉,当客户端连接丢失的时候(如退出链接),所有东西都会取消监视
watch流程
事务回滚
Redis不支持事务回滚这种做法优点:
1.不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速
2.Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中
Redis事务和数据库事务
一般来说,事务有四个性质称为ACID,分别是原子性,一致性,隔离性和持久性。这是基础,但是很多文章对Redis 是否支持ACID有一些异议
原子性atomicity
Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
一致性consistencyredis
redis事务可以保证命令失败的情况下得以回滚,数据能恢复到没有执行之前的样子,是保证一致性的,除非redis进程意外终结。
隔离性Isolationredis
Redis会保证一个事务内的命令依次执行,而不会被其它命令插入
持久性Durabilityredis
事务是不保证持久性的,这是因为redis持久化策略中不管是RDB还是AOF都是异步执行的,不保证持久性是出于对性能的考虑。
__EOF__

本文链接:https://www.cnblogs.com/hoaer/p/17348520.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?