【Redis系列】事务特性

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生
🔥Redis系列 从数据类型到核心特性解析 项目必备

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

事务

事务这个词我们之前在数据库中也有学习,并且Redis的事务和MySQL的事务在概念上是类似的,都是把一系列操作绑定成一组操作,让这一组操作批量执行(要么全部成功,要么全部失败)

特性 MySQL Redis
原子性 完全支持,失败时自动回滚 命令队列整体执行,但无回滚(失败就失败)
一致性 通过约束、外键、事务日志保证 无约束机制,也没有回滚机制
隔离性 支持多种隔离级别 单线程顺序执行:天然隔离
持久性 通过redo/undo log 保证(取决于配置) AOF持久化部分保证,EXEC后才写入日志
  • MySQL事务是真正的数据库事务,为复杂业务提供强一致性保证
  • Redis事务本质是命令批量执行,适用于高性能场景下的简单原子操作,需结合 WATCH 实现乐观锁。

Redis事务本质上是在服务器上有一个"事务队列",每次客户端在事务中进行一个操作,都会把命令发给服务器,放到"事务队列"中(但不会并立即执行),正真收到EXEC命令后,才会在队列中执行所以操作。

所以,Redis的事务功能比MySQL弱化很多,只能保证事务中的这⼏个操作是"连续的", 不会被别的客⼾端"加塞",仅此⽽已

事务操作

MULTI

multi:开启一个事务,执行成功返回OK

EXEC

exec:真正执行事务

每次添加一个操作,都会提示"QUEUED",说明命令进入客户端队列了,真正执行EXEC命令的时候,客户端才会把这些操作发给服务器,去真正执行命令。

DISCARD

discard:放弃当前事务,此时直接清空事务队列,之前在队列中的操作都不会真正执行到

WATCH

在执行事务的时候,如果某个事务中修改的值,被别的客户端修改了,此时就容易出现数据不一致的情况

从输入命令的时间看,客户端1 执行set k1 111,客户端 2 执行set k1 222,

而从实际的执行时间看,客户端2 执行,客户端 1执行。

这个时候两个客户端都对k1进行修改,肯定有用户得到不符合预期的结果,所以watch命令就解决了这个问题。watch在该客⼾端上监控⼀组具体的key。

  • 当开启事务的时候,如果对watch监控的key进行修改,服务器就会记录当前key的"版本号"
  • 在真正提交事务的时候,如果发现当前服务器上的key的版本号已经超过了事务开启时候的版本号,就会让事务执行失败(事务中所有操作都不执行)

总结

  1. 因为redis单线程顺序执行,所以事务期间不会穿插执行其他客户端命令,天然提供隔离性,无需锁机制。
  2. 无回滚设计:Redis 认为语法错误应该在开发阶段发现,运行时错误通常是逻辑错误,应该被修复而非回滚
  3. 批量操作原子性:MULTI开启事务,批量设置多个键值,EXEC真正批量执行命令
  4. watch实现乐观锁并发控制,假设冲突较少,先操作再检查;在保证数据一致性的同时,提供无锁的高并发能力

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
毛驴赶鹿4 小时前
【金仓数据库征文】KES V9性能调优实战记录:从慢SQL排查到全链路优化
数据库·sql
码农阿豪4 小时前
【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南
数据库·macos·docker
杨云龙UP4 小时前
MySQL 数据库常用备份工具对比:mysqldump、mydumper 与 XtraBackup
linux·运维·服务器·数据库·mysql·dba·备份恢复
ZENERGY-众壹5 小时前
500个工商业电站压垮数据库?海量光伏时序数据存储的架构取舍
数据库·架构·influxdb·光伏·光伏运维
mubei-1236 小时前
SpringDAO的用法
java·开发语言·数据库
风曦Kisaki6 小时前
Kubernetes(K8s)笔记Day06: 持久化存储(emptyDir,hostPath,NFS),PV 和 PVC,StorageClass存储类
linux·运维·笔记·云原生·容器·kubernetes
星蓝_starblue8 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
三84410 小时前
sqli-labs1-10通关笔记
数据库
wgego11 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
BullSmall12 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存