【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 损失函…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...