当前位置: 首页 > news >正文

说一下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"

相关文章:

说一下redis事务底层原理

Redis事务 1. 事务的基本流程 Redis 事务通过 MULTI、EXEC、WATCH 等命令实现,底层原理可以分为以下几个步骤: (1) MULTI 命令 当客户端发送 MULTI 命令时,Redis 会将客户端标记为“事务模式”。在事务模式下,客户端发送的所有…...

eNSP中AR2220、AR201、AR1220、AR2240、AR3260、Router、NE40E、NE5000E、NE9000、CX路由器学习笔记

eNSP中常见华为路由器型号的接口特性详解及横向对比,重点关注接口类型、扩展能力和适用场景: 缩写解释: LPU:Line Processing Unit(线路处理单元) SPU:Service Processing Unit(业务…...

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

文章目录 FastGPT 引申:借鉴 FastGPT 基于MySQL ES 实现知识库(含表结构以及核心代码)一、整体思路二、存储结构2.1 MySQL 表结构(1) knowledge_base_dataset(2) knowledge_base_data(3) knowledge_base_index(4) ai_kb_relation 2.2 Elasti…...

WPF+WebView 基础

1、基于.NET8&#xff0c;通过NuGet添加Microsoft.Web.WebView2。 2、MainWindow.xaml代码如下。 <Window x:Class"Demo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/win…...

skia的学习与研究

最近再研究skia,特地发一篇文章来记录一下。Skia版本更新非常频繁&#xff0c;大概每四周就会创建一个新版本&#xff0c;此版本持续维护六周左右就会被标记为稳定分支&#xff1b; skia三套渲染&#xff1a; 无gpu硬件如嵌入式设备&#xff0c;使用CPU渲染&#xff0c;使用…...

Linux--基础命令3

大家好&#xff0c;今天我们继续学习Linux的基础命令 mv命令 mv命令是move的缩写&#xff0c;可以用来移动文件或者将文件改名 move(rename) files&#xff0c;经常⽤来备份⽂件或者目录 语法: mv [ 选项 ] 源⽂件或目录 目标⽂件或目录 mv src[文件、目录] dst[路径、文…...

[LeetCode]day33 150.逆波兰式求表达值 + 239.滑动窗口最大值

逆波兰式求表达值 题目链接 题目描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 ‘’、‘-’、‘*’ 和 ‘/’ 。 每个操作数&#xff08;运…...

记一次误禁用USB导致键盘鼠标失灵的修复过程

背景说明 在电脑上插入了一个USB hub&#xff0c;然后弹窗提示&#xff1a;“集线器端口上出现电涌”&#xff0c;点开让选择“重置”或者“关闭”&#xff0c;不小心点了关闭&#xff0c;结果这个usb口就被关了&#xff0c;再插任何东西都没反应&#xff0c;找了很多办法都恢…...

node项目前后端密码加密传输及存储方案

前端&#xff1a;使用crypto-js库的SHA256算法&#xff0c;包含用户注册时使用的邮箱加上自定义的secret key生成盐值&#xff0c;接着使用PBKDF2算法进行加密。最后将加密后的密码传给后端。 import CryptoJS from "crypto-js";export const encryptPassword (ema…...

GIt分支合并

分支 1: C0 → C1 → C2 → C3&#xff08;最新&#xff09; 分支 2: C0 → C4 → C5 → C6&#xff08;最新&#xff09;1. 找到共同父节点 C0 Git 会先找出 branch1 和 branch2 的共同祖先节点 C0。这通常借助 git merge-base 命令达成&#xff0c;虽然在日常使用 git merge…...

Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境

文章目录 一、VSCode配置Python开发环境1、软件安装2、安装Python插件3、配置Python环境4、包管理5、调试程序 前言 Visual Studio Code&#xff08;简称VSCode&#xff09;以其强大的功能和灵活的扩展性&#xff0c;成为了许多开发者的首选。本文将详细介绍如何在VSCode中配置…...

linux一些使用技巧

linux一些使用技巧 文件名称和路径的提取切换用户执行当前脚本一行演示单引号与双引号的使用curl命令仅输出响应头信息,不输出body体文件名称和路径的提取 文件路径为 /tmp/tkgup/test.sh 方式获取文件名获取文件路径获取文件全路径方式一basename ${file}dirname ${file}real…...

GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代(上)

目录 文章目录 目录1960s~1999&#xff1a;GPU 的诞生&#xff1a;光栅化&#xff08;Rasterization&#xff09;3D 渲染算法的硬件化实现之路学术界算法研究历程工业界产品研发历程光栅化技术原理光栅化技术的软件实现&#xff1a;OpenGL 3D 渲染管线设计1. 顶点处理&#xff…...

chrome Vue.js devtools 提示不支持该扩展组件,移除

可能是版本不兼容&#xff0c;可以重新安装&#xff0c;推荐网址极简插件官网_Chrome插件下载_Chrome浏览器应用商店 直接搜索vue&#xff0c;下载旧版&#xff0c;vue2、vue3都支持&#xff0c;上面那个最新版本试了下&#xff0c;vue2的肯定是不能用...

大模型工程师学习日记(十):基于 LangChain 构建向量存储和查询 Qdrant

Qdrant介绍 Qdrant&#xff08;读作&#xff1a;quadrant /kwɑdrənt/ n. 象限&#xff1b;象限仪&#xff1b;四分之一圆&#xff09;是一个向量相似度搜索引擎。它提供了一个生产就绪的服务&#xff0c;具有方便的 API 来存储、搜索和管理点 - 带有附加载荷的向量。Qdrant专…...

Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程

Spring Boot拦截器&#xff08;Interceptor&#xff09;与过滤器&#xff08;Filter&#xff09;详细教程 目录 概述 什么是拦截器&#xff08;Interceptor&#xff09;&#xff1f;什么是过滤器&#xff08;Filter&#xff09;&#xff1f;两者的核心区别 使用场景 拦截器的典…...

ffmpeg源码编译支持cuda

1.安装cuda CUDA Toolkit 11.3 Downloads | NVIDIA Developer 在选择组件的时候&#xff0c;将CUDA中的Nsight VSE和Visual Studio Integration取消勾选 不然会安装失败 2.编译ffmpeg 把cuda编译宏定义开启&#xff0c;再编译avcodec 3.编译livavutil报错struct "Cuda…...

【Linux 系统层面应急响应并分析日志溯源的流程】

Linux 层面响应安全事件并分析日志溯源的流程 一、事件响应核心流程1. 初步隔离与现场保护2. 关键日志收集与备份 二、日志分析工具链与溯源步骤1. 基础日志分析工具2. 高级日志分析框架3. 恶意行为深度检测4. 时间线重构工具 三、关键注意事项1. 日志可信度验证2. 攻击者反取证…...

【笔记ing】python

1 Python基础概念及环境搭建 1.1 python简介及发展史 之父Guido van Rossum。ABC语言的替代品。Python提供了高效的数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及解释性语言的本质&#xff0c;使之成为多数平台上写脚本和快速开发应…...

QT 作业 day4

作业 代码 Widget.h class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slots:// 槽函数void on_listWidget_itemDoubleClicked(QListWidgetItem *item);private:Ui::Widget *ui; }; #endif Widget.cpp Widget::Widget(QW…...

flink和yarn和mpp架构区别

为了全面理解 Flink 架构、YARN 架构和 MPP 架构的区别&#xff0c;我们从多个维度进行分析。以下是详细的对比&#xff1a; 1. 设计目标 架构设计目标Flink实时数据流处理和批处理&#xff0c;支持低延迟、高吞吐量的实时分析。YARN作为 Hadoop 的资源管理框架&#xff0c;负…...

DeepSeek崛起:如何在云端快速部署你的专属AI助手

在2025年春节的科技盛宴上&#xff0c;DeepSeek因其在AI领域的卓越表现成为焦点&#xff0c;其开源的推理模型DeepSeek-R1擅长处理多种复杂任务&#xff0c;支持多语言处理&#xff0c;并通过搜索引擎获取实时信息。DeepSeek因其先进的自然语言处理技术、广泛的知识库和高性价比…...

高频 SQL 50 题(基础版)_1141. 查询近30天活跃用户数

1141. 查询近30天活跃用户数 select activity_date day,count(distinct user_id) active_users from Activity where (activity_date<2019-07-27 and activity_date>DATE_sub(2019-07-27,INTERVAL 30 DAY)) group by(activity_date)...

DRMPlaneType里有VIG, DMA,和RGB三种类型,这是不是说明DRMPlane就是代表DPU里的Pipeline

DRMPlane 代表了 DPU&#xff08;Display Processing Unit&#xff09; 里的 Pipeline&#xff08;数据通路&#xff09;&#xff0c;不同的 DRMPlaneType 对应 DPU 内部的不同 渲染/合成管线。 &#x1f4cc; DRMPlaneType 与 DPU Pipeline 的关系 在 高通&#xff08;Qualco…...

not support ClassForName

com.alibaba.fastjson2.JSONException: not support ClassForName : java.lang.String, you can config JSONReader.Feature.SupportClassForName 官方说明中提到默认关闭&#xff0c; 可通过配置开启 JSON.config(JSONReader.Feature.SupportClassForName);...

为什么要学习数据结构与算法

今天&#xff0c;我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心&#xff0c;更是每一位开发者从“小白”迈向“高手”的必经之路。 1、为什么要学习数据结构与算法 总的来说&#xff0c;数据结构与算法是&#xff1a; 求职的“敲门砖”…...

从浏览器输入网址,到页面展示都发生了什么?

查询缓存 其实从填写上url按下回车后&#xff0c;我们就进入了第一步就是 DNS 解析过程&#xff0c;首先需要找到这个 url 域名的服务器 ip,为了寻找这个 ip&#xff0c;浏览器首先会寻找缓存&#xff0c;查看缓存中是否有记录缓存的查找记录为&#xff1a;浏览器缓存>系统…...

Octave3D 关卡设计插件

课程参考链接 这位大佬有在视频合集中有详细的讲解&#xff0c;个人体验过&#xff0c;感觉功能很强大 https://www.bilibili.com/video/BV1Kq4y1C72P/?share_sourcecopy_web&vd_source0a41d8122353e3e841ae0a39908c2181 Prefab资源管理 第一步 在场景中创建一个空物体…...

JavaWeb后端基础(4)

这一篇就开始是做一个项目了&#xff0c;在项目里学习&#xff0c;我主要记录在学习过程中遇到的问题&#xff0c;以及一些知识点 Restful风格 一种软件架构风格 在REST风格的URL中&#xff0c;通过四种请求方式&#xff0c;来操作数据的增删改查。 GET &#xff1a; 查询 …...

【计算机网络】IP协议

目录 1. 协议头格式 2. 网段划分 3. 特殊的IP 4. 公网IP && 内网IP 总结 网络层的IP协议主要解决的是什么问题&#xff1f;——将数据包从B主机发送给C主机&#xff1b;传输层协议tcp提供可靠的策略&#xff1b;网络层IP协议提供数据数据传输的能力&#xff1b; 发…...

Libgdx游戏开发系列教程(2)——接水滴游戏实现

目录 游戏玩法 步骤 1.创建项目 2.添加资源文件 3.设置游戏配置 4.加载资源文件 5.播放背景音乐 6.绘制图形 7.雨滴下落实现 8.判断雨滴是否掉落在桶里 9.键盘控制改变桶位置 10.随机雨滴 打包 本文使用Kotlin语言开发 通过本文的学习可以初步了解以下基础知识的…...

【2025rust笔记】超详细,小白,rust基本语法

一、常见cargo命令 查看cargo版本 cargo --version创建cargo项目 create new demo_name构建编译项目 cargo build运行项目 cargo run检查项目代码 cargo check (比cargobuild快)发布构建项目 cargo build --release 电子markdown/pdf格式 二、小demo-----猜数游戏 1、print…...

将 SSH 密钥添加到 macOS 的钥匙串中

git提交代码时&#xff0c;如果SSH密码并未免密&#xff0c;每次拉取&#xff0c;上传操作时都需要密码输入&#xff0c; 可将SSH密钥添加到钥匙串中 git config --global credential.helper store报错&#xff1a; WARNING: The -K and -A flags are deprecated and have bee…...

Gpt翻译完整版

上一篇文章收到了很多小伙伴的反馈&#xff0c;总结了一下主要以下几点&#xff1a; 1. 说不知道怎么调api 2. 目前只是把所有的中文变成了英文&#xff0c;如果想要做多语言还需要把这些关键字提炼出来成放到message_zh.properties和message_en.properties文件中&#xff0c…...

CC++的内存管理

目录 1、C/C内存划分 C语言的动态内存管理 malloc calloc realloc free C的动态内存管理 new和delete operator new函数和operator delete函数 new和delete的原理 new T[N]原理 delete[]的原理 1、C/C内存划分 1、栈&#xff1a;存有非静态局部变量、函数参数、返回…...

HTTP 状态代码 501 502 问题

问题 单个客户端有时会出现 报错 501 或 502 如下&#xff1a; System.Net.Http.HttpRequestException: Response status code does not indicate success: 501 (Not Implemented) 分析 可以排除 服务器无法处理的问题&#xff08;测试发现 一个客户端报错&#xff0c;不会影响…...

virtio_video virtio_snd

在 Qualcomm 平台的 虚拟机&#xff08;VM&#xff09; 环境中&#xff0c;qcom,virtio_snd 是 VirtIO 机制下的 音频 DMA 共享 设备节点&#xff0c;它用于 虚拟机和宿主机&#xff08;Hypervisor&#xff09;之间共享音频数据&#xff0c;类似于标准的 VirtIO 声音设备。 1️…...

【大模型安全】大模型安全概述

【大模型安全】大模型安全概述 1.大模型安全目前的关键挑战技术安全合规安全 2.大语言模型的安全隐患与主要风险点3.大语言模型与国家安全风险4.大语言模型的信息安全原则 1.大模型安全目前的关键挑战 技术安全 1、数据的安全与合理利用 大语言模型通常需要处理大量敏感数据…...

基于 vLLM 部署 LSTM 时序预测模型的“下饭”(智能告警预测与根因分析部署)指南

Alright,各位看官老爷们,准备好迎接史上最爆笑、最通俗易懂的 “基于 vLLM 部署 LSTM 时序预测模型的智能告警预测与根因分析部署指南” 吗? 保证让你笑出猪叫,看完直接变身技术大咖!🚀😂 咱们今天的主题,就像是要打造一个“智能运维小管家”! 这个小管家,不仅能提…...

深入理解三色标记、CMS、G1垃圾回收器

三色标记算法 简介 三色标记算法是一种常见的垃圾收集的标记算法&#xff0c;属于根可达算法的一个分支&#xff0c;垃圾收集器CMS&#xff0c;G1在标记垃圾过程中就使用该算法 三色标记法&#xff08;Tri-color Marking&#xff09;是垃圾回收中用于并发标记存活对象的核心算…...

【车规芯片】如何引导时钟树生长方向

12nm车规DFTAPR项目中&#xff0c;我们可以看到&#xff0c;绝大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1这个mux&#xff0c;这是我们DFT设计结果&#xff1a; 这里我们重新打开place的数据 Anchor&#xff0c;也就…...

基于Spring Boot的企业车辆管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

Spring Boot 中短时间连续请求时出现Cookie获取异常问题

Spring Boot 中短时间连续请求时出现Cookie获取异常问题 一、问题描述&#xff1a;异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源 二、问题详细分析1. 场景重现2. 问题分析 三、如何避免影响下一次请求&#xff1f;✅方式 1&#xff1a;在主线程提前复制 …...

轮播图案例

&#xff08;1&#xff09;、搭建轮播图的结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>轮播图结构</title><!-- <script src"../js/tools.js"></script> --…...

通俗版解释:分布式和微服务就像开餐厅

一、分布式系统&#xff1a;把大厨房拆成多个小厨房 想象你开了一家超火爆的餐厅&#xff0c;但原来的厨房太小了&#xff1a; 问题&#xff1a;一个厨师要同时切菜、炒菜、烤面包&#xff0c;手忙脚乱还容易出错。 解决方案&#xff1a; 拆分成多个小厨房&#xff08;分布式…...

【开源-常用C/C++命令行解析库对比】

以下是几种常用的C/C命令行解析库的对比表格&#xff0c;以及它们的GitHub开源库地址&#xff1a; 库名称语言特点是否支持子命令是否支持配置文件是否支持自动生成帮助信息GitHub地址ClaraC11及以上单一头文件&#xff0c;轻量级&#xff0c;非异常错误处理&#xff0c;自动类…...

JavaEE_多线程(一)

目录 1. 为啥要有线程1.1 线程是什么1.2 进程和线程的区别1.3 Java如何进行多线程编程 2 使用线程2.1 创建线程2.2 Thread类的几个常见方法和属性2.2.1 Thread常见构造方法2.2.2 Thread常见属性2.2.3 常见其他方法 2.3 终止一个线程2.3.1 通过共享的标记位来进行沟通2.3.2 调用…...

table 拖拽移动

表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...

【QGIS二次开发】地图显示与交互-01

1. 系统界面设计 设计的系统界面如下&#xff0c;很好还原了QGIS、ArcGIS等软件的系统界面&#xff0c;充分利用了QT中顶部工具栏、菜单栏、底部状态栏&#xff0c;实现了图层管理器、鹰眼图、工具箱三个工具面板。 菜单栏、工具栏、工具箱集成了系统中实现的全部功能&#x…...

Microsoft.Office.Interop.Excel 的简单操作

Microsoft.Office.Interop.Excel 的简单操作 1、安装 Microsoft.Office.Interop.Excel2、声明引用 Microsoft.Office.Interop.Excel3、简单的新建 EXCEL 操作代码4、将 DataGridView 表数据写到 EXCEL 操作代码5、将 EXCEL 表数据读取到 C# 数据表 DataTable 操作代码 1、安装 …...