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

Redis事务详解:原理、使用与注意事项

文章目录

  • Redis事务详解:原理、使用与注意事项
    • 什么是Redis事务
    • Redis事务的基本使用
      • 基本事务示例
      • 事务执行过程
    • Redis事务的错误处理
      • 1. 入队错误
      • 2. 执行错误
    • WATCH命令:乐观锁实现
    • Redis事务的局限性
    • 事务的最佳实践
    • Lua脚本
    • 总结

Redis事务详解:原理、使用与注意事项

什么是Redis事务

Redis事务是一组命令的集合,这些命令会被顺序化并串行执行,保证在执行期间不会被其他客户端的命令插入。Redis事务的主要目的是保证一系列命令的原子性执行。

与关系型数据库的事务(ACID)不同,Redis事务有以下特点:

  • 没有隔离级别概念:事务中的命令在执行前不会被实际执行,也就不会有"事务内的查询看到事务里的更新"这种情况
  • 不保证原子性:Redis事务中如果某条命令执行失败,后续命令仍然会执行
  • 没有回滚机制:命令执行失败后不会自动回滚已执行的命令

Redis事务的基本使用

Redis事务通过以下三个命令实现:

  1. MULTI:标记事务开始
  2. EXEC:执行事务中的所有命令
  3. DISCARD:取消事务,放弃执行事务块内的所有命令

基本事务示例

> MULTI
OK
> SET user:1:name "Alice"
QUEUED
> SET user:1:age 30
QUEUED
> EXEC
1) OK
2) OK

事务执行过程

  1. 客户端发送MULTI命令,服务器返回OK
  2. 之后的所有命令都会被服务器放入队列而不是立即执行,服务器返回QUEUED
  3. 客户端发送EXEC命令,服务器按顺序执行队列中的所有命令
  4. 服务器返回一个数组,包含每个命令的执行结果

Redis事务的错误处理

Redis事务中的错误分为两种:

1. 入队错误

在命令入队时就能检测到的错误(如语法错误),这类错误会导致整个事务无法执行。

> MULTI
OK
> SET key value
QUEUED
> NONEXISTINGCOMMAND
(error) ERR unknown command 'NONEXISTINGCOMMAND'
> EXEC
(error) EXECABORT Transaction discarded because of previous errors.

2. 执行错误

在命令执行时出现的错误(如对字符串执行INCR操作),这类错误不会影响事务中其他命令的执行。

> MULTI
OK
> SET key1 "hello"
QUEUED
> INCR key1
QUEUED
> SET key2 "world"
QUEUED
> EXEC
1) OK
2) (error) ERR value is not an integer or out of range
3) OK

WATCH命令:乐观锁实现

Redis提供了WATCH命令来实现乐观锁,可以在MULTI/EXEC事务之前监视一个或多个键:

> WATCH key1 key2
OK
> MULTI
OK
> SET key1 "new value"
QUEUED
> EXEC
(nil)  // 如果在WATCH后EXEC前有其他客户端修改了key1或key2,事务会执行失败

WATCH机制工作流程:

  1. 客户端使用WATCH监视某些键
  2. 执行MULTI开始事务
  3. 在EXEC执行时,如果发现被监视的键被修改过,则拒绝执行整个事务
  4. 如果未被修改,则正常执行事务

Redis事务的局限性

  1. 不支持回滚:Redis事务中某条命令失败后,不会回滚已执行的命令
  2. 无隔离级别:事务中的命令在执行前不会被实际执行
  3. 性能考虑:长时间运行的事务会阻塞其他客户端
  4. 命令有限制:某些命令(如INFO, SHUTDOWN等)不能在事务中使用

事务的最佳实践

  1. 尽量保持事务短小精悍,避免长时间运行的事务
  2. 合理使用WATCH实现乐观锁,处理并发修改
  3. 对于需要回滚的场景,需要自行实现补偿逻辑
  4. 在集群环境下,事务中的所有键必须位于同一个节点(使用相同的hash slot)

Lua脚本

对于复杂的事务需求,Redis推荐使用Lua脚本:

EVAL "local current = redis.call('GET', KEYS[1])
if current == ARGV[1] then
return redis.call('SET', KEYS[1], ARGV[2])
else
return 0
end" 1 mykey "old value" "new value"

Lua脚本的优势:

  • 原子性执行
  • 减少网络开销(多个命令一次发送)
  • 灵活性高,可以实现复杂逻辑

总结

  • Redis事务是将一组命令打包一起执行
  • 不保证原子性,如果过程发生错误不会进行回滚
  • 没有隔离级别的概念,事务中的命令不会提前执行,事务内不能提前看到事务外,事务外也同理

相关文章:

Redis事务详解:原理、使用与注意事项

文章目录 Redis事务详解:原理、使用与注意事项什么是Redis事务Redis事务的基本使用基本事务示例事务执行过程 Redis事务的错误处理1. 入队错误2. 执行错误 WATCH命令:乐观锁实现Redis事务的局限性事务的最佳实践Lua脚本总结 Redis事务详解:原…...

提升 GitHub Stats 的 6 个关键策略

哈哈,GitHub 的 “B-” 评级 其实是个玄学问题,但确实有一些 快速提升的技巧!你的数据看起来 提交数(147)和 PR(9)不算少,但 Stars(21)和贡献项目数&#xff…...

CSS Animation 详解

CSS Animation 允许元素平滑地从一个样式状态过渡到另一个样式状态。通过设置关键帧(keyframes),可以控制动画序列中的中间步骤。 一、核心概念 1.关键帧(Keyframes) 使用 keyframes 规则定义动画序列通过百分比或 …...

LabVIEW 中内存释放相关问题

在LabVIEW 编程领域,内存管理是一个关键且复杂的议题。我们常常关注 LabVIEW 如何将内存释放回操作系统(OS),以及是否有方法确保在特定数据结构(如队列、变体属性、动态数据引用 DVR 等)销毁、删除或清空后…...

【HarmonyOS 5】鸿蒙中的UIAbility详解(三)

【HarmonyOS 5】鸿蒙中的UIAbility详解(三) 一、前言 本文是鸿蒙中的UIAbility详解系列的最终章。主要针对UIAbility的冷启动和热启动,对于want数据的处理。UIAbility的备份恢复,UIAbility的接续等高级功能的概念和使用讲解。 …...

基于内存高效算法的 LLM Token 优化:一个有效降低 API 成本的技术方案

在使用 OpenAI、Claude、Gemini 等大语言模型 API 构建对话系统时,开发者普遍面临成本不断上升的挑战。无论是基于检索增强生成(RAG)的应用还是独立的对话系统,这些系统都需要维护对话历史以确保上下文的连贯性,类似于…...

vue-11(命名路由和命名视图)

命名路由和命名视图 命名路由和命名视图提供了组织和导航 Vue.js 应用程序的强大方法,尤其是在它们的复杂性增加时。它们提供了一种语义更合理、可维护的路由方法,使您的代码更易于理解和修改。命名路由允许您按名称引用路由,而不是依赖 URL…...

(附代码)自定义 LangChain 文档分割器,深入探索 LangChain 文档分割策略与应用

自定义文档分割器 在 LangChain 中,如果内置的文档分割器均没办法完成需求,还可以根据特定的需求实现自定义文档分割器(一般极少),实现的方法也非常简单,继承文本分割器基类 TextSplitter,在构造…...

Python打卡训练营Day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业:理解下今天的代码即可 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as tr…...

基于微信小程序的scratch学习系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…...

MATLAB实战:机器学习分类回归示例

以下是一个使用MATLAB的Statistics and Machine Learning Toolbox实现分类和回归任务的完整示例代码。代码包含鸢尾花分类、手写数字分类和汽车数据回归任务,并评估模型性能。 %% 加载内置数据集 % 鸢尾花数据集(分类) load fisheriris; X_i…...

动态库导出符号与extern “C“

1. windows下动态库导出符号 根据C/C语法规则,函数声明中的修饰符(如__declspec(dllexport))可以放在返回类型之前或返回类型之后、函数名之前。这两种方式在功能上是等价的,编译器会以相同的方式处理。 __declspec(dllexport) …...

小知识:STM32 printf 重定向(串口输出)--让数据 “开口说话” 的关键技巧

引言 在 C 语言开发中,printf函数是我们调试程序、输出数据的得力助手,它能将格式化的数据输出到标准输出设备(通常是屏幕)。然而,在嵌入式领域,STM32 单片机并没有默认的显示设备,要让printf函…...

`docker commit` 和 `docker save`区别

理解 docker commit 和 docker save 之间的区别对于正确管理 Docker 镜像非常重要。让我们详细解释一下这两个命令的作用及其区别。 1. docker commit 作用: docker commit roop-builder roop:v1 命令的作用是基于一个正在运行的容器 roop-builder 创建一个新的镜…...

【C++ 多态】—— 礼器九鼎,釉下乾坤,多态中的 “风水寻龙诀“

欢迎来到一整颗红豆的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由一整颗红豆原创✍️,感谢支持❤️!请尊重原创…...

SCSAI平台面向对象建模技术的设计与实现

一、核心设计思想 SCSAI平台的核心目标是通过元建模(Meta-Modeling)技术实现面向对象建模的零编码化。其核心思想为: 自反性设计:定义ObjectClassInfo (OCI)为元类(Meta-Class),所有对象类均为…...

pikachu通关教程-CSRF

CSRF(get) 用bp进行抓包 选择action value值的修改 点击test in browser copy然后放在bp代理的浏览器上,会出现一个提交按钮,这时候点击之后信息就被修改了。 CSRF(post) 请求的方式不同,其他都是一样 CSRF Token 存在cookie 首先要先下载一…...

智能体觉醒:AI开始自己“动手”了-自主进化开启任务革命时代

1. 智能体:AI从“工具”到“伙伴”的关键跃迁 1.1 什么是智能体? 智能体(Agent)是AI的“进化版”——它不再局限于生成文字或图像,而是能像人类一样“规划任务”“调用工具”甚至“协同合作”。例如,一个…...

Python爬虫实战:研究Aiohttp库相关技术

1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网络上的数据量呈爆炸式增长。爬虫作为一种自动获取网络信息的工具,在数据挖掘、信息检索、舆情分析等领域有着广泛的应用。传统的同步爬虫在面对大量 URL 时效率低下,无法充分利用现代计算机的多核资源和网络带宽。而异…...

【C++指南】C++ list容器完全解读(二):list模拟实现,底层架构揭秘

. 💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 文章目录 引言一、链表节点设计:双向链表的基石1.1 节点类的实现 二、list框架与核心成员函…...

[神经网络]使用olivettiface数据集进行训练并优化,观察对比loss结果

结合归一化和正则化来优化网络模型结构,观察对比loss结果 搭建的神经网络,使用olivettiface数据集进行训练,结合归一化和正则化来优化网络模型结构,观察对比loss结果 from sklearn.datasets import fetch_olivetti_faces #倒入数…...

小明的Java面试奇遇之智能家装平台架构设计与JVM调优实战

一、文章标题 小明的Java面试奇遇之智能家装平台架构设计与JVM调优实战 二、文章标签 Java面试, 智能家装, 微服务架构, 高并发设计, JVM调优, SpringCloud, 消息队列, 分布式缓存, 架构设计, 面试技巧 三、文章概述 本文模拟了程序员小明应聘智能家装平台后端架构师的5轮…...

n8n:技术团队的智能工作流自动化助手

在当前数字化时代,自动化已经成为提高效率和减轻人工工作负担的一大推动力。今天,我们要为大家介绍一款极具潜力的开源项目——n8n,它不仅拥有广泛的应用场景,还具备内置AI功能,能够完全满足技术团队的高效工作需求。n8n的出现,为技术团队提供了自由编程与快速自动化构建…...

Flink 核心机制与源码剖析系列

Flink 核心机制与源码剖析系列 目录 第一篇:Flink 状态管理原理与源码深度剖析第二篇:水位线、事件时间与定时器源码全流程第三篇:Flink CEP 模式建模与高效事件匹配机制 第一篇:Flink 状态管理原理与源码深度剖析 1. 背景与意…...

华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机

5月21日,信创论坛于上海漕河泾会议中心举办。本次论坛以“聚力融合,繁荣生态”为主题,话题聚焦工业制造、交通运输、金融、教育、医疗等领域。华院计算技术(上海)股份有限公司(以下简称“华院计算”&#x…...

华为OD机试真题——会议接待 /代表团坐车(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《会议…...

LabVIEW Val (Sgnl) 属性

在 LabVIEW 事件驱动架构中,Val (Sgnl) 属性(Value (Signaling))是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同,Val (Sgnl) 在修改控件值的同时强制生成值改变事件,确保程序逻辑与 UI 交互保持…...

STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联

目录 一、STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联1 TIM1 高级定时器发波1.1 stm32cubemx配置 2 TIM1 ADC COMP DAC级联2.1 stm32cubemx配置 附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^) 一、STM32G4 电机外设篇(三&…...

DAY 35 超大力王爱学Python

知识点回顾: 三种不同的模型可视化方法:推荐torchinfo打印summary权重分布可视化进度条功能:手动和自动写法,让打印结果更加美观推理的写法:评估模式 作业:调整模型定义时的超参数,对比下效果。…...

【数据结构】图的存储(十字链表)

弧节点 tailvex数据域:存储弧尾一端顶点在顺序表中的位置下标;headvex 数据域:存储弧头一端顶点在顺序表中的位置下标;hlink 指针域:指向下一个以当前顶点作为弧头的弧;tlink 指针域:指向下一个…...