说一下redis事务底层原理

Redis事务

1. 事务的基本流程

Redis 事务通过 MULTIEXECWATCH 等命令实现,底层原理可以分为以下几个步骤:

(1) MULTI 命令
  • 当客户端发送 MULTI 命令时,Redis 会将客户端标记为“事务模式”。
  • 在事务模式下,客户端发送的所有命令不会立即执行,而是被放入一个队列(命令队列)中。
(2) 命令入队
  • MULTIEXEC 之间,客户端发送的所有命令都会被追加到事务队列中。
  • 这些命令不会立即执行,而是等待 EXEC 命令的触发。
(3) EXEC 命令
  • 当客户端发送 EXEC 命令时,Redis 会依次执行事务队列中的所有命令。
  • 执行过程中,所有命令是原子的,不会被其他客户端的命令打断。
(4) WATCH 命令
  • WATCH 命令用于实现乐观锁。
  • 当客户端对一个或多个键执行 WATCH 后,如果在 EXEC 执行之前,这些键被其他客户端修改,则当前事务会失败(返回 nil

watch我们可以指定监听一个键和多个键,然后exec批量执行

WATCH key [key ...]

2. 事务的原子性

  • Redis 事务的原子性是通过单线程模型实现的。
  • Redis 是单线程的,所有命令都是顺序执行的。在 EXEC 执行时,事务队列中的命令会连续执行,不会被其他客户端的命令打断。

3. 事务的一致性

  • Redis 事务的一致性是通过 WATCH 机制实现的。
  • 如果 WATCH 的键在事务执行期间被修改,事务会失败,从而保证数据的一致性。

4. 事务的局限性

  • 不支持回滚:如果事务中的某个命令失败,其他命令仍然会执行,Redis 不会自动回滚。
  • 部分失败问题:事务中的命令可能会部分成功、部分失败。
  • 性能开销WATCH 机制会增加额外的性能开销。

Redis 7 对事务的优化

Redis 7 在事务机制上并没有完全改变底层实现,但引入了一些优化和改进:

1. 性能优化

  • Redis 7 对事务的执行流程进行了优化,减少了事务模式下的性能开销。
  • 通过改进命令队列的处理方式,提高了事务的执行效率。

2. Lua 脚本的增强

  • Redis 7 对 Lua 脚本的支持进行了增强,使得 Lua 脚本可以更好地与事务结合使用。
  • Lua 脚本在 Redis 7 中的执行效率更高,同时支持更多的 Redis 命令。

3. 更好的错误处理

  • Redis 7 改进了事务中的错误处理机制,使得事务失败时的错误信息更加清晰。
  • 如果事务中的某个命令失败,Redis 7 会返回更详细的错误信息,方便排查问题。

4. 功能增强

  • Redis 7 引入了更多的命令和功能,可以与事务结合使用。
  • 例如,Redis 7 支持更多的数据类型和操作,使得事务可以处理更复杂的场景。

Redis 事务的底层实现细节

1. 命令队列

  • 在事务模式下,Redis 会为每个客户端维护一个命令队列。
  • 所有在 MULTIEXEC 之间发送的命令都会被追加到队列中。

2. 事务执行

  • EXEC 命令被触发时,Redis 会依次执行命令队列中的所有命令。
  • 执行过程中,Redis 会保证命令的原子性,不会被其他客户端的命令打断。

3. WATCH 机制

  • WATCH 命令会监视一个或多个键。
  • 如果在 EXEC 执行之前,这些键被其他客户端修改,则当前事务会失败。
  • WATCH 的实现基于 Redis 的键空间通知机制。

总结

  • Redis 事务的底层原理 是基于 MULTI/EXEC/WATCH 机制,通过命令队列和乐观锁实现原子性和一致性。
  • Redis 7 在事务机制上进行了性能优化和功能增强,但底层实现并没有本质变化。
  • Redis 事务的局限性 包括不支持回滚、部分失败问题和性能开销。
  • 如果需要更强大的事务支持,可以结合 Lua 脚本或使用支持 ACID 事务的数据库。

Redis+Lua脚本实现手动回滚补偿

我们每一步执行失败,我们就依次撤销前面的操作

可惜这个并不是真正的acid,我们的mysql执行事务的时候宕机了,它的事务没有提交所以数据并不会进到mysql里面

而redis是人为控制的,所以我们执行lua脚本的时候宕机了,我们之前事务中执行的操作数据仍然进去了,这个是我们无法解决的

local key1 = KEYS[1]
local key2 = KEYS[2]
local key3 = KEYS[3]
local value = ARGV[1]-- 记录原始值
local original_value1 = redis.call('GET', key1)
local original_value2 = redis.call('GET', key2)
local original_value3 = redis.call('GET', key3)-- 第一步操作
redis.call('SET', key1, value)-- 第二步操作
if redis.call('EXISTS', key2) == 0 then-- 手动回滚第一步操作redis.call('SET', key1, original_value1)return "Key2 does not exist"
end
redis.call('SET', key2, value)-- 第三步操作
if redis.call('EXISTS', key3) == 0 then-- 手动回滚前两步操作redis.call('SET', key1, original_value1)redis.call('SET', key2, original_value2)return "Key3 does not exist"
end
redis.call('SET', key3, value)return "Transaction successful"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【我的Android进阶之旅】如何使用NanoHttpd在Android端快速部署一个HTTP服务器?

文章目录 开篇:程序员的"摸鱼神器"?一、为什么选择NanoHttpd?二、五分钟极速上车指南2.1 ▶ 第一步:引入依赖的哲学2.2 ▶ 第二步:创建服务器类:继承大法好2.3 ▶ 第三步:启动服务的仪式感三、高级玩法:让服务器不再单调3.1 🔥 场景1:变身文件服务器3.2 �…

播放器系列3——解码

FFmpeg解码过程详解 解码流程 #mermaid-svg-FGu92IEtteOdO2tO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FGu92IEtteOdO2tO .error-icon{fill:#552222;}#mermaid-svg-FGu92IEtteOdO2tO .error-text{fill:#5522…

SimPO算法-Simple Preference Optimizationwith a Reference-Free Reward

偏好优化(preference optimization )算法大全: 本篇介绍下SimPO SimPO(Simple Preference Optimization)的设计核心在于简化偏好优化过程,同时提升模型的表现。其设计主要围绕两个关键点展开:长…

AIGC时代:如何快速搞定Spring Boot+Vue全栈开发

文章目录 一、Spring Boot基础二、Vue.js基础三、Spring Boot与Vue.js集成四、性能优化与最佳实践《快速搞定Spring BootVue全栈开发》 内容简介作者简介目录前言/序言本书内容本书特点读者对象 随着人工智能生成内容(AIGC)技术的迅速发展,…

探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验

文章目录 2.5 CRC 校验2.5.1 前言2.5.2 CRC算法简介2.5.3 CRC计算的详细过程2.5.4 CRC校验的两种方法详解**分离比较法****整体运算法****不同位出错与余数的关系****总结** 2.5.5 CRC计算的C实现及工具介绍**C实现CRC计算****CRC计算工具推荐** **2.5.6 总结:CRC校…

AUTOSAR微控制器抽象层(MCAL)详解及综合实例

目录 1. 微控制器抽象层(MCAL)概述 1.1 MCAL的核心功能 1.2 MCAL的模块划分 1.3 MCAL的工作流程 2. MCAL的详细功能解析 2.1 微控制器驱动 2.1.1 时钟配置 2.1.2 电源管理 2.1.3 实例:时钟配置 2.2 通信驱动 2.2.1 CAN驱动 2.2.2 实例:CAN通信的实现 2.3 I/O驱…

探究高空视频全景AR技术的实现原理

1. 引言 笔者认为现阶段AR技术的应用是还是比较坑爹的,大都是噱头多但是实用的成分少,拿出来做做DEMO是可以,但是难以在实际的项目中落地产生实际的经济价值。一方面是很难在业务上难以找到合适的应用场景(可能管线相关的项目算一…

深度解析 | 2025 AI新突破,物理信息神经网络(PINN):Nature级顶刊的「科研加速器」,70份源码论文速取!

🔥 为什么全球顶尖实验室都在押注PINN? 过去一年,物理信息神经网络(PINN,Physics-Informed Neural Networks)以「现象级」姿态席卷科研圈:不仅在NeurIPS、ICML等顶会横扫15%相关论文&#xff0c…

0基础学前端---品优购项目Day14

0基础学前端—品优购项目Day14 视频参考:B站Pink老师 本节重点:all 项目链接:完整的项目已放到 品优购完整项目 大家可以自行下载 强调内容 这里主要强调两个知识点: (1) 网站TDK三个标签SEO优化 (2) logo SEO优化 网站TDK三个…

LeetCode热题100JS(37/100)第七天|排序链表|合并K个升序链表|LRU缓存|二叉树的中序遍历|二叉树的最大深度|对称二叉树

148. 排序链表 题目链接:​​​​​​​148. 排序链表 难度:中等 刷题状态:1刷 新知识: - dic.reduceRight((t,c)>(c.nextt,c),null) 方法从数组的末尾开始执行 解题过程 思考 示例 1: 输入:head […

课程2. 机器学习方法论

课程2. 机器学习方法论 训练算法并评估其质量将样本分成训练和测试。分层 交叉验证方法sklearn 接口算法模型训练模型的应用质量评估 数据预处理标准缩放Violinplot 数据集使用模型Pipeline 在上一讲中,我们讨论了机器学习专家面临的挑战。无论解决的问题类型和解决…

六足仿生机器人地形自适应步态规划研究

六足仿生机器人地形自适应步态规划研究 第1章 绪论第2章 机器人系统建模第3章 地形感知与建模第4章 自适应步态生成算法第5章 动力学仿真与实验第6章 驱动代码设计与实现源码&文档链接 第1章 绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.2.1 多足机器人步态规划 1.2.2 …

mysql表分区

本文简述了mysql表分区的作用和特点,又演示了mysql表分区的创建过程,详细演示了指定不同分区目录时的处理办法。由于表分区对crud操作是透明的,对于普通开发同学其实不用过多关注,但是本着学习的态度,在分库分表等高大…

Nessus安装

Nessus:https://pan.quark.cn/s/f5fb09b6d4fb 1.软件安装 点击安装,剩下的下一步即可。 直接下一步安装即可 2.Web端安装 会弹出一个web窗口 开始初始化 创建用户 开始初始化 3.Cracker 会弹一个黑窗口 运行完,回车即可。访问https://loc…

26-小迪安全-模块引用,mvc框架,渲染,数据联动0-rce安全

先创建一个新闻需要的库 这样id值可以逐级递增 然后随便写个值,让他输出一下看看 模板引入 但是这样不够美观,这就涉及到了引入html模板 模板引入是html有一个的地方值可以通过php代码去传入过去,其他的html界面直接调用,这样页…

第十三届蓝桥杯大赛软件赛决赛C/C++ 大学 B 组

A 【2022——暴力DP / 优雅背包】-CSDN博客 B 【钟表——类日期问题】-CSDN博客 C 【卡牌——二分】-CSDN博客 D 【最大数字——DFS】-CSDN博客 E 【出差——Dijkstra】-CSDN博客 F 【费用报销——01背包】-CSDN博客 G 【故障——条件概率】-CSDN博客 H 【机房—…

树莓集团最新现状更新:南京园区业务的创新与突破

树莓集团在南京的园区业务呈现出蓬勃发展的态势,不断实现创新与突破。 在产业布局方面,南京园区进一步优化了产业结构。除了继续巩固数字影像、数字娱乐等传统优势领域外,还积极拓展了数字金融、数字教育等新兴领域。吸引了一批知名的数字金融…

Linux网络编程(20250301)

网络通信:进行不同主机的进程间通信 解决硬件与软件的互联互通 主机-->交换机-->路由器-->广域网-->路由器-->交换机-->主机 IP地址:区分不同主机 MAC地址:计算机硬件地址 端口号:区分主机上的不同进程 1…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录B-严格模式

附录B、严格模式 严格模式 ECMAScript 5 首次引入严格模式的概念。严格模式用于选择以更严格的条件检查 JavaScript 代码错误,可以应用到全局,也可以应用到函数内部。严格模式的好处是可以提早发现错误,因此可以捕获某些 ECMAScript 问题导致…

蓝桥试题:混境之地(记忆化搜索)

一、问题描述 小蓝有一天误入了一个混境之地。 好消息是:他误打误撞拿到了一张地图,并从中获取到以下信息: 混境之地是一个n⋅m 大小的矩阵,其中第 i 行第 j 列的的点 h i j​ 表示第 i 行第 j 列的高度。他现在所在位置的坐标…