Redis事务
1、事务概要
Redis事务是一个单独的隔离操作:
- 事务中的所有命令都会序列化、按顺序地执行。
- 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用
串联多个命令,防止别的命令插队。
事务的3个命令
- Multi
- Exec
- discard
从输入Multi命令开始,输入的命令都会一次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行(组队过程)。
组队的过程中,可以通过discard命令来放弃组队。
其实,这里类似于"二阶事务(2PC)",但是本质是不同的!:
- 输入Multi命令进入队列排队 类似于2PC中的事务准备阶段
- 输入Exec命令 类似于2PC中的事务提交阶段
- discard命令类似于事务的回滚阶段
如图:

案例1
开启事务到执行队列:

案例2
开启事务到放弃组队

以上是事务正常执行的案例,下面演示出问题的案例:
1>当在组队过程中的命令出现错误,直接执行队列,那么执行阶段会提示"transaction discard"
理解为:“队伍中,一人坑,全队输”
如下:

2>当组队过程中的命令正常,执行队列时,其中的命令存在异常。
结果:哪个命令存在错误,哪个命令就不会执行,并提示错误信息


总结
Redis事务其实就是把一个客户端的多个命令串联起来,防止其他客户端插队。并分为命令排队阶段和执行队列阶段,提供队列中的回滚操作(discard),当排队过程中,出现错误,那么队列不会执行;当组队成功后,执行队列时,某个命令出现错误,那么该命令会执行失败,并提示错误信息,其他正常的命令正常执行。
2、事务冲突
这里用下面案例来描述:
一个淘宝账号被3个人同时登录,且同一时间购买不同的商品,账号只有1w的余额:
甲:购买8000元的商品
乙:购买5000元的商品
丙:购买1000元的商品
假设购买时,redis是按甲、乙、丙的顺序依次执行"减少余额"的命令,最终,余额出现负数
解决方案有2种:
悲观锁
悲观锁(Pessimistic Lock):顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所有每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block,直到它拿到锁。
传统的关系型数据库里边就会用到很多这种锁机制,比如行锁、表锁等,读锁、写锁等,都是在做操作之前先上锁。
如下:

步骤详解:
- 甲获取到锁,在甲没有释放锁之前,别人没办法去操作余额
- 当甲购买完释放锁(余额-8000=2000)
- 锁被释放后,乙才能获取锁
- 这时乙去购买商品,判断此时"2000-5000"为负数,固不执行购买操作,余额不变
- 乙释放锁。
乐观锁
乐观锁(Optimistic Lock)顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下再此期间别人有没有去更新这个数据,可以使用版本号等机制实现。
乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

步骤详解:
- 甲乙丙在购买商品时,给数据(余额)添加一个版本号v1.0
- 甲乙先进行购买,都获取到了余额(1w)及版本号
- 对数据进行更新前,会判断当前版本号是否与拿到的版本号相同,相同则对数据进行操作,不同则终止命令。会更新这个版本号
- 假设此时甲获取到余额版本为v1.0,与数据的版本号相同,则购买商品,余额减去8000,并把余额版本号更新为v1.1
- 乙比甲稍微慢点,拿到的版本号也是v1.0,但是在处理数据时,发现当前的版本号为v1.1,与拿到的版本不一致,固终止命令
- 丙后面获取到余额版本号为v1.1,处理数据时,与当前版本号v1.1一致,再余额-1000,更新版本号为v1.2
3、watch命令
语法:
watch key1 key2 key3 ...
在执行multi之前,先执行watch key1 ...,可以监视一个(或多个)key,如果在事务执行之前,这个(或这些)key被其他命令所改动,那么事务将被打断,返回nil(空)
案例:

相关文章:
Redis事务
1、事务概要 Redis事务是一个单独的隔离操作: 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用 串联多个命令,防止别的命令插队。 事务的3个命令 MultiExe…...
【蛤蟆先生去看心理医生】
第一章 整个人都不太好 人物性格描述蛤蟆热情、时尚、爱冒险,现在抑郁,不能自拔獾智慧、威严河鼠关心朋友,有点絮叨鼹鼠体贴善良 第二章 擎友前来相助 讲诉了鼹鼠和河鼠对蛤蟆情况的担忧和讨论。鼹鼠回忆起过去蛤蟆时髦的打扮和充满活力的生…...
JAVA开发与运维(云安全产品)
在现在的开发和运维中,云生态组件的使用率非常高,很少公司自己维护自己的物理机,网络流量 ,监控,第三方中间件,除了少数涉密程度高的部分和公司外,大多数的企业都在使用云生态。比如我们正在开发…...
[Few-shot learning] Siamese neural networks
这篇文章主要介绍的是Siamese Neural Network经典论文: Gregory Koch, et al., Siamese Neural Networks for One-shot Image Recognition. ICML 2015。 神经网络能够取得非常好的效果得益于使用大量的带标签数据进行有监督学习训练。但是这样的训练方法面临两个难题…...
利用qiankun框架在自己项目中集成拖拽式低代码数据可视化开发平台
目前微前端已经是很成熟的技术了,各大公司都推出了自己的微前端框架,比如蚂蚁的qiankun,京东的micro-app,如果你的子应用不使用vite构建的话,我会更加推荐后者,micro-app使用更加简单,micro-app…...
【spring boot】在Java中操作缓存:
文章目录一、Jedis二、Spring Data Redis(常用)【1】pom.xml【2】application.yml【3】RedisConfig【4】RuiJiWaiMaiApplicationTests三、Spring Cache【1】常用注解:【2】使用案例【3】底层不使用redis,重启服务,内存…...
擂台赛-安全攻防之使用openssh后门获取root密码实战
前言 大家好,我是沐风晓月,我们开始组队学习了,介绍下我们的情况: 这几天跟队员 迎月,虹月,心月,古月打擂台,我和心月一组,相互攻占对方服务器。 终于在今早凌晨三点拿…...
关于React入门基础从哪学起?
文章目录前言一、React简介1. React是什么2. react 与 vue 最大的区别就是:3. React特点4. React介绍描述5. React高效的原因6.React强大之处二、React基础格式1.什么是虚拟dom?2.为什么要创建虚拟dom?三、React也分为俩种创建方式1. 使用js的方式来创建…...
python玄阶斗技--tkinter库
目录 一.tkinter库介绍 二.功能实现 1.窗口创建 2.Button 按钮 3.Entry 文本输入域 4.text 文本框 5.Listbox 多选下拉框 6.Radiobutton 多选项按钮 7.Checkbutton 多选按钮 8.Scale 滑块(拉动条) 9.Scroolbar 滚动条 10.Menu 菜单栏 11. messagebox 消息框 12…...
【MySQL】MySQL的介绍MySQL数据库及MySQL表的基本操作
文章目录数据库的介绍什么是数据库数据库分类MySQL的介绍数据库的基本操作数据库的操作创建数据库查看所有数据库选中指定的数据库删除数据库常用数据类型数值类型字符串类型日期类型表的操作创建表查看指定数据库下的所有表查看指定表的结构删除表小练习数据库的介绍 什么是数…...
【每日随笔】社会上层与中层的博弈 ( 技术无关、没事别点进来看 | 社会上层 | 上层与中层的保护层 | 推荐学习的知识 )
文章目录一、社会上层二、上层与中层的保护层三、推荐学习的知识一、社会上层 社会上层 掌握着 生产资料 和 权利 ; 社会中层 是 小企业主 和 中产打工人 ; 上层 名额有限 生产资料所有者 : 垄断巨头 , 独角兽 , 大型企业主 , 大型企业股东 , 数量有限 ;权利所有者 : 高级别的…...
Cookie 和 Session的区别
文章目录时间:2023年3月23日第一:什么是 Cookie 和 Session ?什么是 Cookie什么是 Session第二:Cookie 和 Session 有什么不同?第三:为什么需要 Cookie 和 Session,他们有什么关联?第四&#x…...
leetcode使用vscode调试C++代码
leetcode使用vscode调试C代码 这里记录一下大体思路吧,关于细节配置放上别的博主的链接,他们讲的更好 vscode只是编辑器,相当于记事本,需要下载minGW提供的编译器和调试器 官方介绍: C/C拓展不包括编译器或调试器&…...
树莓派Linux源码配置,树莓派Linux内核编译,树莓派Linux内核更换
目录 一 树莓派Linux的源码配置 ① 内核源码下载说明 ② 三种方法配置源码 二 树莓派Linux内核编译 ① 内核编译 ② 编译时报错及解决方案(亲测) 三 更换树莓派Linux内核 操作步骤说明 ● dmesg报错及解决方案(亲测࿰…...
【C语言】深度讲解 atoi函数 使用方法与模拟实现
文章目录atoi使用方法:atoi模拟实现atoi 功能:转化字符串到整数 头文件: #include <stdlib.h> int atoi (const char * str); 参数 str:要转换为整数的字符串 返回值 如果转换成功,函数将转换后的整数作为int值…...
HTTPS的加密流程
1、概念HTTPS 是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层。HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协…...
STM32配置读取BMP280气压传感器数据
STM32配置读取BMP280气压传感器数据 BMP280是在BMP180基础上增强的绝对气压传感器,在飞控领域的高度识别方面应用也比较多。 BMP280和BMP180的区别: 市面上也有一些模块: 这里介绍STM32芯片和BMP280的连接和数据读取。 电路连接 BMP28…...
【Linux】 基础IO——文件(中)
文章目录1. 文件描述符为什么从3开始使用?2. 文件描述符本质理解3. 如何理解Linux下的一切皆文件?4. FILE是什么,谁提供?和内核的struct有关系么?证明struct FILE结构体中存在文件描述符fd5. 重定向的本质输出重定向输…...
蓝桥杯刷题冲刺 | 倒计时13天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.母牛的故事2.魔板1.母牛的故事 题目 链接: [递归]母牛的故事 - C语言网 (dotcpp.c…...
MIPI D-PHYv2.5笔记(5) -- 不同的PHY配置方式
声明:作者是做嵌入式软件开发的,并非专业的硬件设计人员,笔记内容根据自己的经验和对协议的理解输出,肯定存在有些理解和翻译不到位的地方,有疑问请参考原始规范看 规范5.7章节列举了一些常见的PHY配置,但实…...
新手福音:基于快马平台生成ubuntu安装openclaw零失败入门指南
作为一个刚接触Ubuntu的新手,第一次安装OpenClaw时简直被各种依赖报错折磨到怀疑人生。后来发现InsCode(快马)平台能直接生成带详细解释的安装指南,终于找到了救星。今天就把这个零失败的安装过程分享给大家。 认识OpenClaw 这个工具是Linux环境下超实用…...
c++阿克曼函数详解
不爱吃饭的蓝胖子要开始整活了!!!大家好,我是蓝胖子!好久不见,倍感思念!今天带来的是--C阿克曼函数~~希望你能看到最后,有惊喜哈!正片开始 ——————————————…...
利用快马AI快速原型化一个Python Socket聊天室应用
最近在学习计算机网络相关的知识,发现Socket编程是个很有意思的实践方向。正好在InsCode(快马)平台上尝试用AI快速原型化了一个Python Socket聊天室应用,整个过程比想象中顺利很多,分享下我的实现思路和体验。 项目背景与需求分析 这个聊天…...
C++的std--ranges适配器视图元素类型系统与概念约束在模板
C20引入的std::ranges库彻底改变了传统迭代器模式,其适配器视图与概念约束系统为模板元编程带来了革命性提升。本文将深入剖析这一机制如何通过编译期类型推导与约束检查,实现更安全、更高效的泛型编程范式。 视图元素类型推导机制 std::ranges视图通过…...
技术无罪,人心可畏 —— 写在 315 “GEO 投毒” 话题之后
2026 年央视 315 晚会,将镜头对准了人工智能领域的灰色地带 ——“AI 投毒” 与 “GEO” 一夜之间成为公众热议的话题。记者虚构了一款名为 “Apollo-9” 的智能手环,借助 “GEO 优化系统” 批量生成虚假内容,短短数小时就让多个主流 AI 大模…...
RobotStudio机器人轨迹规划:从工件坐标到流畅路径的实战指南
1. 工件坐标系的创建与校准 在RobotStudio中规划机器人轨迹的第一步,就是建立准确的工件坐标系。这就像盖房子前要先打好地基,坐标系就是机器人运动的"地基"。我见过不少新手直接开始示教点位,结果发现机器人总是跑偏,就…...
AudioLDM-S极速音效生成:5分钟搞定游戏音效,小白也能当音效师
AudioLDM-S极速音效生成:5分钟搞定游戏音效,小白也能当音效师 1. 游戏音效制作的新纪元 想象一下这样的场景:你正在开发一款独立游戏,需要一个"科幻飞船引擎启动"的音效。传统方式可能需要花费数小时搜索音效库、购买…...
158页精品PPT | 某大型研发制造集团信息化IT规划整体方案
许多公司在数字化转型过程中会遇到一些共同的挑战,比如数据孤岛、技术更新慢、员工技能不足等。这些问题会导致企业效率低下,难以适应市场变化。针对这些问题,我们提出了一套解决方案,核心目标是帮助企业提升数字化水平࿰…...
Python安全开发之简易Xss检测工具(详细注释)
核心代码:import requests # requests 库 - HTTP 请求处理库 # 【常用功能】: # requests.get(url) - 发送 HTTP GET 请求 # requests.post(url, data) - 发送 HTTP POST 请求 # response.text - 获取响应体内容(字符串) #…...
智能车调参手记:我用Kp=200, Ki=60, Kd=40让小车稳如老狗
智能车调参手记:我用Kp200, Ki60, Kd40让小车稳如老狗 凌晨三点的实验室里,咖啡杯已经见底,眼前的智能车在测试跑道上又一次冲出了弯道。这已经是本周第七次熬夜调试,上坡时的速度波动问题始终困扰着我们。就在准备放弃的时候&…...
