🌈 个人主页:Zfox_
🔥 系列专栏:Redis

🔥 什么是事务

Redis的事务和MySQL的事务概念上是类似的.都是把⼀系列操作绑定成⼀组.让这⼀组能够批量执⾏.

但是注意体会Redis的事务和MySQL事务的区别:

  • 弱化的原⼦性:redis没有"回滚机制" .只能做到这些操作"批量执⾏".不能做到"⼀个失败就恢复到初始状态".
    • MySQL 的原子性是要么全部执行成功,要么全都不执行
  • 不保证⼀致性:不涉及"约束".也没有回滚.MySQL的⼀致性体现的是运⾏事务前和运⾏后,结果都是合理有效的,不会出现中间⾮法状态.
  • 不需要隔离性:也没有隔离级别,因为不会并发执⾏事务(redis单线程处理请求).
  • 不需要持久性:是保存在内存的.是否开启持久化,是 redis-server⾃⼰的事情,和事务⽆关.

Redis事务本质上是在服务器上搞了⼀个"事务队列". 每次客户端在事务中进⾏⼀个操作,都会把命令先发给服务器,放到"事务队列"中 (但是并不会⽴即执⾏)

⽽是会在真正收到EXEC命令之后,才真正执⾏队列中的所有操作.

因此,Redis的事务的功能相⽐于MySQL来说,是弱化很多的.只能保证事务中的这⼏个操作是"连续的",不会被别的客户端"加塞",仅此⽽已.

🔥 事务操作

🦋 MULTI

开启⼀个事务.执⾏成功返回OK.
实例

127.0.0.1:6379> MULTI
OK

🦋 EXEC

真正执⾏事务.
实例

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> set k3 3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK

每次添加⼀个操作,都会提⽰"QUEUED",说明命令已经进⼊客户端的队列了.

真正执⾏EXEC的时候,客⼾端才会真正把上述操作发送给服务器.

此时就可以获取到上述key的值了.

127.0.0.1:6379> get k1
"1"
127.0.0.1:6379> get k2
"2"
127.0.0.1:6379> get k3
"3"

🦋 DISCARD

放弃当前事务.此时直接清空事务队列.之前的操作都不会真正执⾏到.
实例

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> get k2
(nil)

🦋 WATCH

在执⾏事务的时候,如果某个事务中修改的值,被别的客⼾端修改了,此时就容易出现数据不⼀致的问
题.

实例

# 客⼾端1 先执⾏
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key 100
QUEUED
# 客⼾端2 再执⾏
127.0.0.1:6379> set key 200
OK
# 客⼾端1 最后执⾏
127.0.0.1:6379> EXEC
1) OK

此时,key的值是多少呢??

从输⼊命令的时间看,是客⼾端1先执⾏的setkey100.客⼾端2后执⾏的setkey200.
但是从实际的执⾏时间看,是客⼾端2先执⾏的,客⼾端1后执⾏的.

127.0.0.1:6379> get key
"100"

这个时候,其实就容易引起歧义.
因此,即使不保证严格的隔离性,⾄少也要告诉⽤⼾,当前的操作可能存在⻛险.

watch命令就是⽤来解决这个问题的.watch在该客⼾端上监控⼀组具体的key.

  • 当开启事务的时候,如果对watch的key进⾏修改,就会记录当前key的"版本号".(版本号是个简单的整数,每次修改都会使版本变⼤.服务器来维护每个key的版本号情况)
  • 在真正提交事务的时候,如果发现当前服务器上的key的版本号已经超过了事务开始时的版本号,就会让事务执⾏失败.(事务中的所有操作都不执⾏).

实例

客⼾端1先执⾏

127.0.0.1:6379> watch k1 # 开始监控 k1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 100 
# 进⾏修改, 从服务器获取 k1 的版本号是 0. 记录 k1 的版本号. (还没真修改呢, 版本号不变)
QUEUED
127.0.0.1:6379> set k2 1000
QUEUED

只是⼊队列,但是不提交事务执⾏.
客⼾端2再执⾏

127.0.0.1:6379> set k1 200 # 修改成功, 使服务器端的 k1 的版本号 0 -> 1
OK

客⼾端1再执⾏

127.0.0.1:6379> EXEC # 真正执⾏修改操作, 此时对⽐版本发现, 客⼾端的 k1 的版本号是 0, 服务器上的版本号是 1, 版本不⼀致! 说明有其他客⼾端在事务中间修改了 k1 !!!
(nil)
127.0.0.1:6379> get k1
"200"
127.0.0.1:6379> get k2
(nil)

此时说明事务已经被取消了.这次提交的所有命令都没有执⾏.

🦋 UNWATCH

取消对key的监控.
相当于WATCH的逆操作.此处不做演⽰.

🔥 共勉

😋 以上就是我对 Redis:事物 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

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

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

相关文章

CppCon 2018 学习:An allocator is a handle to a heap Lessons learned from std::pmr

“An allocator is a handle to a heap — Lessons learned from std::pmr” 翻译过来就是:“分配器(allocator)是对堆(heap)的一种句柄(handle)——从 std::pmr 中学到的经验”。 基础概念 分…

设备健康实时监测方法演进:从传感网络到AI决策树的工业智能实践

引言:当设备运维遇上AIoT革命 在工业4.0进程中,​毫秒级设备状态捕获能力正成为智能工厂的核心竞争力。传统监测方法因数据滞后、诊断粗放被诟病,本文将深入探讨三大前沿实时监测技术路径,并揭秘中讯烛龙系统如何通过深度强化学习…

剑指offer53_二叉树的深度

二叉树的深度 输入一棵二叉树的根结点,求该树的深度。 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 数据范围 树中节点数量 [ 0 , 500 ] [0,500] [0,500]。 样例 输入&#…

探秘AI的秘密:leaked-system-prompts

揭秘:揭秘系统提示合集背后的秘密 在当今这个人工智能技术迅速发展的时代,了解和使用大型语言模型(LLM)已成为技术爱好者、开发者和研究人员的共同目标。而作为核心组成部分,系统提示(system prompts)的设计和应用直接影响了LLM的表现和功能。今天, 我们将为大家揭示一…

Gaming Mode四大功能(VRR、QMS、QFT、ALLM)

HDMI 2.1定义的Gaming Mode四大功能(VRR、QMS、QFT、ALLM)通过协同优化帧传输、刷新率同步与延迟控制,显著提升了游戏和影音的流畅性与响应速度。以下是这些功能的详细解析及其应用价值: 🔄 1. 可变刷新率(…

数据库总结(关系代数-函数依赖-范式)

以下是关系代数中基本操作的详细说明: 并(Union) 关系R和S的并操作表示为R ∪ S,要求R和S具有相同的属性集(并相容性)。结果包含所有属于R或S的元组,自动去除重复项。 示例: R …

react经验:在nextjs中使用motion组件

什么是motion组件? 一种动画组件 motion组件文档 在nextjs中的应用步骤 1.安装motion npm i framer-motion2.在next.config.js中配置转义 export default {transpilePackages: [framer-motion] }3.开始应用 **注意要点:**在服务端渲染不可直接用&am…

怎样大语言模型 遵守规则

如何让应用中的提示工程更能适应未来变化 目录 如何让应用中的提示工程更能适应未来变化怎样大语言模型 遵守规则提示词 很有效:Memorize these rules提示可分为稳定组件和易变组件怎样大语言模型 遵守规则 实验背景:让大语言模型可靠地遵守规则很难,尤其是规则数量增多时。…

如何通过SSL证书配置防止源站IP泄露 - 全面防护指南

问题背景:SSL证书如何导致源站IP泄露 近期多位站长反馈,即使已部署高防CDN并做好源站IP保密工作,服务器仍频繁遭受DDoS攻击。经深入排查,发现问题根源在于SSL证书。当前网络环境中存在大量爬虫工具24小时不间断扫描全网IP地址&am…

医院信息化发展要经过哪几个阶段

目前,几乎所有的医院都离不开信息技术的建设和支持。没有信息技术,医院的业务可能无法继续。医院信息化的发展主要经历三个阶段,即医院管理信息化阶段、临床管理信息化阶段和医疗智能化阶段。从基础设施的角度来看,每个阶段都有不…

【Vscode】Vscode切换成中文语言

安装中文语言包 启动 VSCode。按下Ctrl Shift X(或者点击左侧边栏的扩展图标),打开扩展面板。在搜索框中输入Chinese (Simplified),在搜索结果里找到Chinese (Simplified) Language Pack for Visual Studio Code并点击安装按钮…

【百日精通JAVA | 数据结构篇】 一文了解泛型体系

一、初识泛型 在推出泛型以前,程序员可以创建一个元素类型Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要明确知道存储每个元素的类型,否则容易引发ClassCastException异常。 泛型是JD…

赋能 Java 工程,飞算科技重新定义智能开发

在数字经济蓬勃发展的当下,软件开发行业正经历着前所未有的变革。飞算科技作为一家自主创新型的数字科技公司,始终以互联网科技、大数据、人工智能等前沿技术为根基。凭借团队在相关领域多年积累的深厚实践经验,公司深度融合技术与应用&#…

【蓝牙】Linux Qt4蓝牙设备列表刷新加载采用什么策略,使用什么对应的Linux命令或dbus接口

在 Linux 系统中,使用 Qt4 开发蓝牙设备列表刷新功能时,通常会结合 BlueZ 蓝牙协议栈 和 D-Bus 通信机制 实现对蓝牙设备的发现与管理。以下是常见的实现策略和对应的命令或接口。 🧩 一、蓝牙设备列表刷新策略 1. 主动扫描(Scan…

产品背景知识——CIFS、SMB 和 Samba

产品背景知识——CIFS、SMB 和 Samba 1. SMB(Server Message Block) 定义: SMB 是一种网络协议,用于在计算机之间共享文件、打印机、串口等资源。它由 IBM 在 1980 年代开发,后被微软采用并扩展。 发展历程&#xff…

基于Python的GIS-RS多源数据处理(TIF/SHP/NC/...)【20250630】

栅格数据以规则网格(像素)的数值矩阵表达地理现象,每个单元格代表一个属性值(如高程、温度)。例如卫星影像、数字高程模型、温度分布图。存储格式包括ENVI DAT、GeoTIFF、JPEG、PNG、ASCII Grid等等。 矢量数据是通过几何图形(点、线、面)表示地理实体,…

基于yolov5的深度学习的昆虫检测带QT界面

完整项目查看或想了解其他项目点击文末名片 项目简介 本项目旨在开发一个基于深度学习的昆虫检测与识别系统。系统使用两个主要模块:昆虫检测器(InsectDetector)和昆虫识别器(InsectIdentifier)。首先,昆虫…

linux使用1

1.终端查看ip地址 # windows ipconfig# linux ifconfig2.VMware共享文件夹权限设置下如何复制/移动文件 # 移动: mv # 查看当前文件夹: ls # 设置管理员权限: sudo # 复制: cp#情景一:移动桌面文件夹(desktop/day4/server/)到共…

ACE之ACE_NonBlocking_Connect_Handler问题分析

问题 ACE_NonBlocking_Connect_Handler在处理异步时存在问题 分析 当connect选择的同步参数为ACE_Synch_Options::USE_REACTOR时,连接超时时间为ACE_Time_Value::zero,在同步发起连接返回的错误码为EWOULDBLOCK时,会发起异步连接nonblocki…

『uniapp』i18n 国际化(保姆级图文)

目录 预览效果项目根目录新建i18n文件夹安装vue-i18n 指定版本main.js 中引入i18n页面展示总结欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新中 预览效果 中文 英文 项目根目录新建i18n文件夹 其中各个语言的json文件