Redis深入浅出【九】Redis的事务机制

matlab 三维绘图 抛光,瓷砖抛光过程建模与仿真 :瓷砖抛 光过程 建模与仿真朱 成 就(广 东工业大学 机 电工程 学院, 广东广州 )摘要 :瓷砖的抛磨影响 因素众 多 ,实际磨削加工时容易出现漏抛 、返抛现象 。对陶瓷抛光机磨头进行运动学分析 ,并基于不 同粒度号 的磨 粒在一定压力下的加工深度模型 ,探讨抛光机磨 头转 速 、横梁摆动频率 、传送速度对瓷砖抛光加工表 面均匀性 的影响,然 后结合 磨削机理使 用 对陶瓷抛光过程进行仿真 ... 阅读详情

提到事务,相信大家都不陌生,事务的ACID四大特性,也是面试时经常问的,不过一般情况下,我们可能想到的是传统关系型数据库的事务,其实,Redis也是提供了事务机制的,本篇博客就来讲解下Redis的事务机制。

1. 事务演示

Redis的事务提供了一种将多个命令请求打包,然后一次性、按顺序性地执行多个命令的机制。

在事务执行期间,服务器不会中断事务而去执行其它客户端的命令请求,它会将事务中的所有命令执行完毕,然后才去处理其它客户端的命令请求。

下图展示了一个Redis事务的执行过程:

可以看出,事务以MULTI命令开始,然后将多个命令放到事务当中,最后由EXEC命令将这个事务提交给服务器执行。

2. 事务实现原理

一个事务从开始到结束会经历以下3个阶段:

  1. 事务开始
  2. 命令入队
  3. 事务执行

2.1 事务开始

MULTI命令的执行标志着事务的开始。

执行完该命令后,客户端状态的flags属性会打开REDIS_MULTI标识,表示该客户端从非事务状态切换至事务状态。

2.2 命令入队

当一个客户端处于非事务状态时,这个客户端发送的命令会立即被服务器执行:

当一个客户端处于事务状态时,这个客户端发送的命令,服务器是否会立即执行,分为以下2种情况:

  1. 如果客户端发送的命令为MULTI、EXEC、WATCH、DISCARD四个命令中的其中1个,服务器会立即执行这个命令。
  2. 如果客户端发送的命令为以上4个命令外的其它命令,服务器不会立即执行这个命令,而是将其放到事务队列里,然后向客户端返回QUEUED回复。

以上流程可以使用以下流程图来表示:

这里首先提下DISCARD命令,这个命令用于取消事务,放弃执行事务块内的所有命令,如下所示:

然后提下事务队列,每个Redis客户端都有自己的事务状态,事务状态存储在客户端状态的mstates属性里:

事务状态包含1个事务队列和1个已入队命令的数量,如下所示:

事务队列是一个multiCmd类型的数组,数组中的每个multiCmd结构保存了一个已入队命令的相关信息,比如:

  1. 指向命令实现函数的指针,如GET命令、SET命令
  2. 命令的参数
  3. 参数的数量

事务队列以先进先出(FIFO)的方式保存入队的命令。

2.3 事务执行

当一个处于事务状态的客户端执行EXEC命令时,服务器会遍历这个客户端的事务队列,执行队列中保存的所有命令(按先入先出顺序),然后将执行命令的结果一次性返回给客户端。

3. WATCH命令的实现原理

WATCH命令用于监视任意数量的数据库键,并在EXEC命令执行时,检测被监视的键是否被修改,如果被修改了,服务器将拒绝执行事务,并向客户端返回空回复。

为了更好的理解,我们做个演示,首先,我们打开客户端1,执行WATCH命令监视键“name”,然后开启一个事务:

此时,先不要执行EXEC命令,打开客户端2,执行以下命令修改“name”键的值:

然后,在客户端1执行EXEC命令时,会返回空回复,因为“name”键的值在客户端2已经被修改:

那么,WATCH命令的实现原理是什么样的呢?我们从以下3个方面来分析:

  1. 使用WATCH命令监视数据库键
  2. 监视机制的触发
  3. 判断事务是否安全

3.1 使用WATCH命令监视数据库键

每个Redis数据库都保存着1个watched_keys字典,这个字典的键是某个被WATCH命令监视的数据库键,字典的值是一个链表,链表中记录了所有监视相应数据库键的客户端。

举个例子,假如客户端1正在监视键“name”,客户端2正在监视键“age”,那么watched_keys字典存储的数据大概如下:

如果此时客户端3执行了以下WATCH命令:

那么watched_keys字典存储的数据就变为:

3.2 监视机制的触发

那么问题来了,既然watched_keys字典存储了被WATCH命令监视的键,那么监视机制是如何被触发的呢?

答案是所有对数据库修改的命令,比如SET、LPUSH、SADD等,在执行之后都会对watched_keys字典进行检查,如果有客户端正在监视刚刚被命令修改的键,那么所有监视该键的客户端的REDIS_DIRTY_CAS标识将被打开,表示该客户端的事务安全性已经被破坏。

以上图为例,如果键“name”的值被修改,那么客户端1、客户端3的REDIS_DIRTY_CAS标识会被打开。

3.3 判断事务是否安全

最后非常关键的一步是,当服务器接收到一个客户端发来的EXEC命令时,服务器会根据这个客户端是否打开了REDIS_DIRTY_CAS标识来决定是否执行事务,判断的流程图如下所示:

4. 事务执行失败举例

先来看第1个例子,这个事务因为命令入队出错被服务器拒绝执行,事务中的所有命令都不会被执行:

再来看第2个例子,事务入队时出现了不存在的命令,服务器将拒绝执行这个事务:

再来看第3个例子,RPUSH命令在执行期间报错了,但后续命令仍然继续执行,并且之前执行的命令没有受到任何影响:

这个例子也说明Redis事务不支持回滚机制。

5. 总结

Redis的事务提供了一种将多个命令打包,然后一次性、有序地执行的机制,

它的原理是多个命令会被入队到事务队列中,然后按先进先出(FIFO)的顺序执行,

并且事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。

离线AI实战指南:本地部署大模型处理PDF/Word/Excel 离线AI是指在无网络、不上传数据前提下,于个人设备运行大语言模型并完成文档理解、多轮对话与代码辅助等任务的技术方案。其核心依赖本地模型推理、文档解析向量化和轻量级对话调度三大能力。随着Phi-3、Qwen2、Llama3等轻量化开源模型普及,以及Ollama、LM Studio等易用工具成熟,普通用户已可在主流笔记本上实现PDF摘要、合同比对、代码注释等真实办公场景。本文聚焦离线AI的硬件适配、模型选型、文件处理链路与知识库构建,尤其强调中文OCR支持、结构化文档提取与CPU/GPU混合推理优化,助力非开发 阅读详情

相关推荐

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1138

redis的事务机制详解

一、Redis的事务定义 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 二、multi、exec、discard命令 在Redis中从输入multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入exec后,Redis会将之前的命令队列中的命令依次执行。 在组队的过程中可以通过discard来放弃组队,这样先前输入的命令也都将

weixin_48016395的博客 2626

永磁同步电机高效标定技术:从理论到实践的全面解析

本文全面解析永磁同步电机高效标定技术,从MTPA标定、弱磁区优化到初始角校准,详细介绍了理论原理和实战技巧。针对新能源汽车应用场景,提供标定系统集成要点和AI辅助优化方案,帮助工程师提升电机性能标定效率与精度。

weixin_28452161的博客 505

redis的事务

redis通过 multi, exec等命令来实现事务功能,是一种在一个事务内,将事务内的多个请求打包,然后一次性、按顺序地执行多个命令,在事务执行期间,服务器而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。

Zj_boring的博客 1777

Mplus—随机截距交叉滞后模型(Random Intercepts Cross-Lagged Panel Model, RI-CLPM)

介绍随机截距交叉滞后模型(Random Intercepts Cross-Lagged Panel Model, RI-CLPM)的相关知识,例如模型内容、Mplus语法及对应网址等。

m0_54401011的博客 9537

带隙基准电路实战:温度补偿与流片调优全解析

带隙基准(BGR)是模拟芯片中实现高精度、低温漂电压参考的核心电路,其本质是利用硅材料禁带宽度的物理稳定性,通过PTAT(正温度系数)与CTAT(负温度系数)电压的加权叠加抵消温度影响。原理上需兼顾一阶线性补偿与二阶曲率校正,技术价值在于支撑ADC/DAC/LDO等关键模块的精度与可靠性。典型应用场景涵盖车规级MCU、工业传感器和高精度电源管理芯片。工程落地难点集中于工艺偏差、运放失调、寄生效应及版图热电耦合——这正是‘带隙基准设计’与‘带隙基准调优’的根本分野。本文聚焦真实流片经验,深入拆解Widlar架

weixin_42628280的博客 254

Redis 事务的实现详解

在数据库中,事务是一个逻辑操作单元,包含一组要么全部成功执行、要么全部失败的操作。事务通常满足ACID原子性:事务中的所有操作要么全部成功,要么全部失败回滚。一致性:事务执行前后,数据必须处于一致的状态。隔离性:多个事务之间相互独立,不会相互干扰。持久性:事务一旦提交,数据就会被永久保存。

lssffy的博客 1599

PCIe Gen4 Switch芯片PM40028调试踩坑实录:从boot引脚设置到串口无输出的诡异问题

本文记录了PCIe Gen4 Switch芯片PM40028的实战调试过程,重点剖析了从boot引脚配置错误导致串口无输出,到使用逻辑分析仪定位并解决启动问题的完整排障思路。文章深入探讨了芯片启动流程、硬件信号测量方法,并总结了高速硬件调试的核心经验与系统性排查清单,为工程师解决类似PCIe Gen4设备调试难题提供实用指南。

i8j9k0l1的博客 253

Redis中的事务机制

事务表示一组动作,要么全部执行,要么全部不执行。例子如下。Redis提供了简单的事务功能,讲一组需要一起执行的命令放到multi和exec两个命令之间。multi命令代表事务开始,exec命令代表事务结束,如果要停止事务的执行,可以使用discard命令代替exec命令即可。它们之间的命令是原子执行的。

Cover_sky的博客 1378

Spring Boot 实现多图片上传并回显,涨姿势了~

上传 Controller的代码非常简单,由于用了SpringMVC框架,所以直接用MultipartFile来接即可。由于是多图片上传所以用数组来接。此处应该注意参数名应该和<input>中的name值相对应: @RequestMapping("/pic") @ResponseBody publicResponseEntity<String>pic(MultipartFile[]pictures)throwsException{ ResponseEnti...

weixin_54556126的博客 894

基于Python的IMF经济数据爬取与分析:从入门到实战

本文详细介绍了如何使用Python爬取国际货币基金组织(IMF)的经济数据,包括最新的爬虫技术、反反爬策略、数据解析与存储方法。文章从IMF数据源分析开始,逐步讲解如何构建一个完整的爬虫系统,并提供了详细的代码实现和优化建议。通过本文,读者将掌握爬取复杂国际组织数据的关键技术,并能将这些技术应用于其他类似的数据获取场景。关键词:Python爬虫、IMF数据、经济数据获取、数据清洗、反爬策略IMF Data (data.imf.org) - 主要数据门户。

2201_76125261的博客 1439

redis-事务

指令: multi:表示事务的开始 exec:表示执行事务 discard:表示事务的丢弃 watch:监视某个变量的状态 当一个客户端处于事务状态时,这个客户端发送的命令,服务器是否会立即执行,分为以下2种情况: 如果客户端发送的命令为MULTI、EXEC、WATCH、DISCARD四个命令中的其中1个,服务器会立即执行这个命令。 如果客户端发送的命令为以上4个命令外的其它命令,服务器不会立即执行这个命令,而是将其放到事务队列里,然后向客户端返回QUEUED回复。服务器一旦收到exec指令,才开始执行整个

nice_good_boy的博客 138

微信小程序|基于小程序+云开发制作一个租房小程序

经济发展的同时伴随着大批人群的流动,租房需求一直是持久不衰的话题,如何租好房,好租房,跟随此文一起制作一个租房小程序,让租房不再困难。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 4931

Redis 事务机制深入浅出

什么是Redis事务 Redis的事务就是一组命令的集合。Redis提供了将一组命令打包集合的方法,并且能够一次性、按顺序的执行多个命令,事务执行期间,服务器不会中断事务改为执行其他客户端的命令请求,只有事务中所有命令都执行完毕后,服务器才会处理其他客户端的命令请求。 在开始说明事务的使用与基本流程之前,需要先说明关于Redis和事务的两个问题。 Redis事务具有原子性吗? 先给出结论:Redis单条命令具有原子性,Redis事务是否具有原子性存在争议。 笔者认为关于Redis事务原子性的争议存在的主要原

MSSPLANET的博客 948

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深入浅出Redis(五):Redis的事务机制与ACID原则

本篇文章围绕Redis提供的事务机制,深入浅出的介绍了事务相关命令的使用与原理以及事务ACID原则事务开始时会将事务中的命令放入事务队列,事务执行时是对事务队列中的命令依次执行watch命令用watch字典实现,Key为监控的key,Value为监视Key的所有客户端;当对监控的key写操作时,会监控key的所有客户端做标记,客户端执行事务时服务端判断客户端是否有标记,有则说明监视期间被修改,不允许执行事务命令错误会在事务执行时就报错,导致事务不能执行;

关注菜菜的后端私房菜,获取更多技术干货~ 1308

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深入浅出Redis事务

事务大家都熟悉吧,要么全部执行,要么全部不执行,今天我们就来讲讲 Redis 的事务???????????? 一、事务基本使用 在讲解事务的原理之前,我们先来看看 Redis 事务是如何使用的吧 事务在其他语言中,一般分为以下三个阶段: 开启事务——Begin Transaction 执行业务代码,提交事务——Commit Transaction 业务处理中出现异常,回滚事务——Rollback Transaction 但是,Redis 中的事务是不是也是如此呢????????????? Redis

qq_46153765的博客 199

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深入浅出 Redis 事务

一、事务基本使用 在讲解事务的原理之前,我们先来看看 Redis 事务是如何使用的吧 事务在其他语言中,一般分为以下三个阶段: 开启事务——Begin Transaction 执行业务代码,提交事务——Commit Transaction 业务处理中出现异常,回滚事务——Rollback Transaction 但是,Redis 中的事务是不是也是如此呢????????????? Redis 中的事务从开始到结束也是要经历三个阶段: 开启事务 命令入列 执行事务/放弃事务 其中,开启事务使用 mul

帅枫的博客 271

Redis WATCH事务监视机制与回滚

笔者Redis事务相关文章链接:Redis 事务机制深入浅出 概述 Redis内置了WATCH命令,使用WATCH命令可以实现乐观锁的功能,在事务被EXEC命令执行前,如果此前被WATCH监视的某数据库键已经被修改过,则拒绝执行当前事务,返回空并重置客户端事务标识。在并发场景下易使用该命令,很容易理解,有并发的场景就有同步处理。 WATCH的使用 首先明确一点,底层实现中每个Redis客户端内都有一个用于标识事务状态的属性,在每一条命令送到服务器端时,在执行前都会先检查该属性,因为同一条命令在事务状态和非事

MSSPLANET的博客 1953

深入浅出 Redis 高可用:哨兵机制

于是,为了防止这种情况的发生,哨兵部门决定加派人手,每个部门至少 3 个人,每次判断掌门嗝屁时如果有多个人得出相同的判断,才能说明这个判断有效。一当老掌门有消息回复时,哨兵部门就会告诉它,现在已经有新掌门人了,老掌门失联这么久,对门派事务的了解难免落后,所以会让它先担任副掌门。在一些小门派里面,掌门仙逝以后,都会开追悼大会,然后从副掌门中再选一个掌门出来主持大局,这个过程可能会持续好几天。在门派中,这可能是看哪个副掌门的向上管理做得更好,和领导走得更近,毕竟,掌门在选接班人时也会有优先级的侧重。

sjkflw121150的博客 848

Java从零开始学Rediis——4.深入浅出Redis事务和mysql事务MVCC讲解

深入浅出剖析传统关系型数据库事务 一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。 事务的ACID四大特性 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行 一致性(Consistency):事务应确

JAVA求生之路——博主406766467 495

深入理解Redis 事务机制及执行流程源码解析

本篇文章将从源码角度分析整个Redis事务执行的流程,包括MULTI、EXEC、DISCARD、WATCH命令的源码实现以及相关数据结构。 本文源码版本为Redis 5.0,文中涉及到的源码均可在server.h、server.c以及multi.c三个文件中找到。 源码阅读不易,如出现纰漏或理解错误还望指正。

MSSPLANET的博客 1067

深入浅出Redis高可用:哨兵机制

如果说主从同步是 Redis 高可用的数据保障基础,那哨兵机制就是 Redis 高可用的进阶支撑,有了它,就不用担心 Redis 挂了后得人工升级,并且还非常低效的问题了。

qq_40238271的博客 1046

Redis 深入浅出

Redis核心特性与应用摘要 Redis是一款基于内存的高性能键值数据库,其核心特性包括: 极致性能:采用纯内存操作(纳秒级响应)、单线程命令处理(避免锁竞争)、IO多路复用(epoll/kqueue)等技术,单实例可达10万+ QPS 丰富数据结构:支持8种核心数据类型(String/Hash/List/Set/ZSet/Bitmap/HyperLogLog/Stream),满足多样化场景需求 持久化机制:提供RDB快照和AOF日志两种持久化方式,平衡性能与数据安全 典型应用场景: 缓存加速(String

qq_65032048的博客 1121

大数据-42 Redis 发布/订阅详解:机制、弱事务性与实际风险分析

Redis 发布/订阅(Pub/Sub)是一种轻量级消息通信机制,支持客户端订阅频道,并由发布端向频道推送消息,订阅端实时接收。它适合实时通知、日志分发等场景,但存在“弱事务性”:不持久、不确认、无重试。消息只会被当前在线的订阅者接收,无法确保送达与处理成功,易丢失且不可恢复。相比之下,Redis 的事务机制(multi/exec)虽支持一组命令的原子执行,但也不支持回滚,属于“弱事务模型”。因此,在对一致性和可靠性要求较高的业务场景中,推荐使用 Redis Streams 或 Kafka

谢谢你的喜欢 我们一起无限进步 2425

redis深入浅出

Redis是一个开源的内存数据结构存储系统,支持多种数据类型,如string、list、set、hash等。它是一个高性能的key-value数据库,可以用于缓存、消息队列、排名等场景。本文将深入浅出地介绍Redis的基础知识,高级特性,优化与应用、以及常见问题解决。我们还将探讨Redis的安全和备份问题,提供了一些设置和备份操作建议,以保证数据的安全和可靠性。接下来我为大家系统的介绍一下redis,后续对于每个章节都会做详细的说明。

gao571920436的博客 220

Java-126 深入浅出 MySQL 解析 ShardingSphere Saga 柔性事务实现原理

ShardingSphere 通过整合第三方 servicecomb-saga 组件实现柔性事务,核心机制是利用 SPI 动态注入和反向 SQL 技术自动生成补偿操作(如 INSERT 对应 DELETE、UPDATE 对应旧值更新),并交由 Saga 引擎统一管理。该方案降低了业务复杂度,提升了可靠性,并实现了跨库、跨类型数据库的一致性支持。其主要特性包括:自动补偿 SQL 与快照生成、可配置的失败重试策略、持久化事务日志及元数据扩展存储。

谢谢你的喜欢 我们一起无限进步 1287
上一篇: Redis深入浅出【八】发布与订阅
下一篇: 使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值