【redis】redis事务
目录
- Redis事务
- 四个命令
- redis事务特性
- redis事务执行原理
- Redis 事务的使用
- 基本使用
- watch 监控
- watch 实现原理
- 补充
Redis事务
- Redis事务是一种将多个命令打包成一个单独操作的机制,它保证了在执行这些命令期间,其他命令无法插入。
四个命令
Redis事务通过MULTI、EXEC、WATCH和UNWATCH四个命令来实现。
-
MULTI命令:将Redis进入事务模式,之后所有的命令都会被认为是事务中的命令。在执行MULTI命令后,Redis会返回一个QUEUED响应。
-
EXEC命令:用于执行事务中的所有命令。在执行EXEC命令之前,Redis会按顺序记录所有事务中的命令,并在执行期间暂停处理其他命令。
-
WATCH命令:用于监视一个或多个键,当这些键被修改时,事务会被放弃而不执行。WATCH命令可以用来实现乐观锁的机制。
-
UNWATCH命令:用于解除对键的监视。
事务中的每个命令的执行结果会被返回,但只有在执行EXEC命令后,Redis才会真正执行这些命令。如果在事务执行期间出现错误,Redis不会回滚已经执行的命令,而是继续执行剩余的命令。
redis事务特性
- 原子性:在事务执行期间,所有的命令要么全部执行成功,要么全部不执行。
- Redis保证了事务中的命令的原子性,即事务的执行是不可中断的。
与MySQL的事务特性对比来说
- 不具备一致性:redis 没有约束和回滚,事务执行一旦出错,就可能导致不一致的情况.
- 不具备持久性:Redis 本身就是内存数据库,数据是存储在内存中的. 虽然 Redis 也有持久化机制,但是这里的持久化机制和事务没有什么直接关系.
- 不具备隔离性:Redis 是一个单线程模型的服务器程序,所有的请求 / 事务,都是 “串行” 执行的.
redis事务执行原理
Redis事务的执行原理可以简要概括为以下几个步骤:
-
事务开启:使用MULTI命令开启一个事务。在事务开始之后,客户端发送的命令都会被暂时存储在一个事务队列中,而不是立即执行。
-
命令入队:在事务开启后,客户端可以发送多个命令,这些命令会被依次存储在事务队列中,而不会立即执行。
-
事务执行:使用EXEC命令来执行事务中的所有命令。在执行EXEC命令之前,Redis会对事务队列中的所有命令进行一致性检查,确保所有的命令可以顺序执行,并且没有冲突。
-
命令执行:Redis按照顺序执行事务队列中的所有命令。执行过程中,Redis会根据具体的命令类型进行相应的操作,比如读取、修改、删除等。
-
事务结果返回:执行完所有的命令后,Redis会将事务的执行结果以数组的形式返回给客户端。数组中的每个元素对应一个命令的返回结果。
需要注意的是,在事务执行过程中,如果某个命令执行失败,Redis不会回滚已经执行的命令,而是继续执行剩余的命令。执行结果会以特殊的标识表示失败的命令。
另外,Redis还提供了WATCH命令来实现乐观锁机制。客户端可以在事务开始之前使用WATCH命令监视一个或多个键,如果在事务执行期间,这些键被其他客户端修改,事务就会被中断。这可以用来保证事务的原子性和一致性。
Redis 事务的使用
基本使用
multi 开启事务(读作 “猫体”)
exec 执行事务
discard 放弃当前事务
watch 监控某个 key 是否在事务执行之前发生变化(必须搭配事务使用)
unwatch 放弃监控
- 此时开启另一个客户端,查看这几个 key ,会发现这几个 key 并没有被赋值(说明此时还没有执行事务).,如下
- 如果放弃事务,就相当于什么也没有发生
- 如果使用 exec,就会按顺序执行事务
watch 监控
- watch 就是用来监控某个 key 是否在事务执行之前,发生改变,但必须搭配事务来使用.
- 如下,用 watch 监控 key1,开启事务,并在执行事务之前,另一个客户端对 key1 进行修改
- 执行事务后,发现 key 在外部由修改,会返回 nil ,表示事务什么都不会执行,如下
watch 实现原理
在Redis中,watch命令用于在事务中监视一个或多个键,以确保在事务执行期间这些键没有被其他客户端修改。如果在执行事务期间有任何被监视的键发生了变化,事务将被中断并返回错误。
watch命令的实现原理如下:
- 客户端发送watch命令给Redis服务器,指定要监视的键。
- Redis服务器接收到watch命令后,将客户端加入到监视列表中,以便在键被修改时通知客户端。
- 当有其他客户端修改了被监视的键时,Redis服务器会通知所有监视该键的客户端。
- 当客户端执行事务时,Redis会检查被监视的键是否发生了变化。如果发生了变化,Redis将中断事务并返回错误。
- 如果被监视的键没有发生变化,事务将继续执行。
总结起来,watch命令的实现原理是在Redis服务器中维护一个监视列表,并在事务执行之前对被监视的键进行监视。当键发生变化时,通知事务中的客户端并中断事务的执行。这样可以确保在事务执行期间被监视的键没有被其他客户端修改。
补充
- watch 的实现,类似于一个 “乐观锁”。而乐观锁,不是某个具体的锁,而是指某一类锁的特性:加锁之前,就会有一个心里预期,预期接下来锁冲突的概论比较低
- redis 的 watch 就相当于基于 “版本号” 这样的机制,实现 “乐观锁”。
- 当执行 watch key 的时候,就会给 key 安排一个 版本号,版本号可以理解成一个“整数”,每次在修改 key 的时候,版本号都会 “变大” (这个变大是没有规律的,不是每次都增长1),然后在执行 事务 的时候,就会做出判定,判断当前这个 key 的版本号和最初 watch 的时候,记录的版本号是否一致
- 如果一致,说明当前 key 在事务开启到最终执行这个过程中,没有别的客户端修改,才能真正的执行事务.
- 如果不一致,就说明 key 在其他客户端修改过了,因此就直接丢弃事务中的所有操作,最后返回 nil.
相关文章:

【redis】redis事务
目录 Redis事务四个命令redis事务特性redis事务执行原理 Redis 事务的使用基本使用watch 监控watch 实现原理补充 Redis事务 Redis事务是一种将多个命令打包成一个单独操作的机制,它保证了在执行这些命令期间,其他命令无法插入。 四个命令 Redis事务通…...
编程入门费用:揭开学习成本的神秘面纱
编程入门费用:揭开学习成本的神秘面纱 编程,这一曾被视为专业领域的技能,如今已逐渐走入大众视野。越来越多的人开始尝试学习编程,然而,对于初学者来说,编程入门费用无疑是一个重要的考虑因素。那么&#…...
js/javascript获取时间戳的5种方法
1.获取时间戳精确到秒,13位 const timestamp Date.parse(new Date()); console.log(timestamp);//输出 1591669256000 13位 2.获取时间戳精确到毫秒,13位 const timestamp Math.round(new Date()); console.log(timestamp);//输出 1591669961203 13位 3.获取时间戳精…...
window系统下为django自动绘制模型类关系图
Django 提供第三方包 django-extensions,可以用来将 Django 中的 Models 生成 E-R 图。 1 安装包 pip install django-extensions 2 配置 在 Django settings.py 文件, INSTALLED_APPS 中添加 django_extensions INSTALLED_APPS (django_extension…...
Redis的数据淘汰策略和集群部署
05- Redis的数据淘汰策略有哪些 ? Redis 提供 8 种数据淘汰策略: 淘汰易失数据(具有过期时间的数据) volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少…...

解决CentOS 7无法识别ntfs的问题
解决CentOS 7无法识别ntfs的问题 方式一: Centos默认不支持ntfs文件格式,直接在Centos7上插U盘或移动硬盘无法识别,安装 ntfs-3g即可: # yum install epel-release -y # yum install ntfs-3g -y[rootbogon ~]# rpm -qa | grep nt…...

排名前五的 Android 数据恢复软件
正在寻找数据恢复软件来从 Android 设备恢复数据?本指南将为您提供 5 款最佳 Android 数据恢复软件。浏览这些软件,然后选择您喜欢的一款来恢复 Android 数据。 ndroid 设备上的数据丢失可能是一种令人沮丧的经历,无论是由于意外删除、系统崩…...
Java 程序结构 -- Java 语言的变量、方法、运算符与注释
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 003 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…...
淘宝/天猫商品详情优惠券获取API 接口
天猫商品优惠券数据API接口是一种用于获取天猫商品优惠券信息的接口。通过该接口,商家或开发者可以获取到商品的优惠券信息,包括优惠券的名称、金额、使用条件等。 该接口的主要参数包括商品ID、优惠券ID等,通过传入这些参数,可以…...

Vue前端ffmpeg压缩视频再上传(全网唯一公开真正实现)
1.Vue项目中安装插件ffmpeg 1.1 插件版本依赖配置 两个插件的版本 "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1"package.json 和 package-lock.json 都加入如下ffmpeg的版本配置: 1.2 把ffmpeg安装到项目依…...

样式的双向绑定的2种方式,实现样式交互效果
与样式标签实现双向绑定 通过布尔值来决定样式是出现还是消失 show代表着布尔值,show的初始值是false所以文本不会有高亮的效果,当用户点击了按钮,就会调用shows这个函数,并将show的相反值true赋值并覆盖给show,此时show的值为tru…...
供应链经理面试题
供应链经理面试题通常会涉及对供应链管理的基本理解、工作经验、解决问题的能力以及团队协作等多个方面。 请简要介绍一下你在供应链管理领域的工作经验和取得的成绩。你如何定义供应链管理?它在企业中的作用是什么?你认为供应链经理最重要的职责是什么…...

快速理解 Node.js 版本差异:3 分钟指南
Node.js 是一个广泛使用的 JavaScript 运行时环境,允许开发者在服务器端运行 JavaScript 代码。随着技术的发展,Node.js 不断推出新版本,引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南,帮…...
【Qt实现录频】
在Qt中实现录制视频可以通过使用Qt Multimedia模块来实现。你可以使用QCamera类来访问摄像头并捕获视频数据。以下是一个简单的示例代码,用于在Qt中实现录制视频: #include <QCamera> #include <QCameraInfo> #include <QCameraViewfinder> #include <…...

Golang编译导致的代码错觉
文章目录 背景分析代码疑问 直接上汇编gdb调试优化后的汇编staticunit64s查看禁止优化后的汇编 查看编译过程的SSA生成SSAb对应的SSAc对应的SSAgo官方文档的解释 对比C语言的表现总结 背景 网上看到一段代码,来源是Golang 编译器优化那些事,百思不得其解…...

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件
SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件 H2 是一个用 Java 开发的嵌入式数据库,它的主要特性使其成为嵌入式应用程序的理想选择。H2 仅是一个类库,可以直接嵌入到应用项目中,而无需独立安装客户端和服务器端。 常用开源数…...
web前端文本大小:从入门到精通的全方位解析
web前端文本大小:从入门到精通的全方位解析 在web前端开发的世界中,文本大小的处理既是基础也是关键的一环。无论是对于初学者还是资深开发者,正确且有效地处理文本大小都显得尤为重要。本文将从四个方面、五个方面、六个方面和七个方面&…...

【报文数据流中的反压处理】
报文数据流中的反压处理 1 带存储体的反压1.1 原理图1.2 Demo 尤其是在NP芯片中,经常涉及到报文的数据流处理;为了防止数据丢失,和各模块的流水处理;因此需要到反压机制; 反压机制目前接触到的有两种:一是基…...

数据挖掘丨轻松应用RapidMiner机器学习内置数据分析案例模板详解(下篇)
RapidMiner 案例模板 RapidMiner 机器学习平台提供了一个可视化的操作界面,允许用户通过拖放的方式构建数据分析流程。RapidMiner目前内置了 13 种案例模板,这些模板是预定义的数据分析流程,可以帮助用户快速启动和执行常见的数据分析任务。 …...

时代巨兽!深度神经网络如何改变我们的世界?
深度神经网络 1、 简介1.1 定义深度神经网络1.2 深度学习的发展历程1.3 深度神经网络的应用领域 2、深度神经网络的基本原理2.1 神经元层2.1.1 神经元2.1.2 神经元层 2.2 前向传播2.3 反向传播2.4 激活函数2.4.1、作用2.4.2、常见激活函数2.4.3、选择激活函数的考虑 2.5 损失函…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...