Redis事务的理解

news2024/10/12 8:02:02

介绍

Redis通过MULTIEXECWATCH等命令来实现事务功能。
事务提供了一种将多个命令请求打包,然后一次性、按照顺序地执行多个命令的机制,并且在事务执行期间,服务器不会因为其他客户端请求而中断事务的执行功能,他会将事务中的所有命令都执行完毕,才会去处理客户端的请求

通过MULTI和EXEC这两个命令就能完成一个简单的事务

  • MULTI开启事务的标志
  • EXEC事务结束的标志
127.0.0.1:6379> set name "zhangsan"
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "zhangsan"
4) "18"

事务执行的原理

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

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

1. 事务开始

MULTI命令的执行 标志着事务的开始
MULTI命令将客户端从非事务状态切换到事务状态,主要是通过修改客户端的一个状态标志位来完成的

2. 命令入队

当一个客户端处于非事务状态时,客户端发送的命令会立即被服务器执行
但是,当一个客户端切换到事务状态之后,服务器就会根据发来的不同命令执行不同的操作

  • 如果是客户端发送的MULTI、DISCARD、WATCH、EXEC四个命令中的一个时,服务器会立即执行这个命令
  • 除了以上四个命令之外的所有命令,服务器并不会立即执行这个命令,而是将这个命令放入到一个事务队列里,向客户端返回QUEUED回复

3. 事务队列

处于事务状态的客户端,在服务端都会有一个事务队列,这个队列中按照先进先出的方式保存了客户端的命令,同时还会有一个变量来表示队列的长度,即命令的数量。

4. 执行事务

当一个处于事务状态的客户端发送EXEC命令时,这个EXEC命令将立即被服务器执行
服务器会遍历这个客户端的事务队列,顺序执行队列中的所有命令,最后将执行的结果全部返回给客户端,这个过程是不会被打断的
也就是说,客户端只有在发送了EXEC命令后,才会真正得到前面那些命令的结果。

WATCH命令

WATCH命令是一个乐观锁,他可以在EXEC命令执行之前,监视任意数量的key,并在EXEC命令执行时,会检查这些key是否已经被修改过了,如果是,则服务端将拒绝执行这个事务,并向客户端返回代表失败的标识。

即,WATCH命令会监视指定的key,如果在本客户端事务的过程中,其他客户端修改了这个key对应的value,那么在本客户端执行EXEC时,WATCH就会发现先检测有没有被修改过,如果是,则服务端拒绝执行这个客户端的事务
WATCH命令必须在MULTI和EXEC之外,不能在这两者之间
正确示例

127.0.0.1:6379> WATCH name
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec
(nil)

事务的ACID

在关系型数据库中事务有ACID的特性:

  • 原子性:一组命令要么全部执行,要么全部不执行
  • 一致性:事务开启前后完成后,数据是一致的
  • 隔离性:一个数据在不同事务中是如何表现的
  • 持久性:数据是持久的,不会消失的

在Redis中,也能说满足这四个特征,并不是完全满足。

原子性

对于关系型数据库来说,事务中的多个操作当做一个整体,要么全部执行,要么全部不执行。
对于Redis事务来说,事务队列中的命令要么就是全部要执行,要么一个都不执行,因此Redis是具有原子性的。
当客户端的一条命令是语法错误的,那么在入事务队列时,就会报错,整个事务队列中的命令就不会执行

Redis事务与关系型数据库事务的最大区别是,Redis事务不支持回滚机制,当服务端执行事务队列里的命令时,一条命令出现了错误,下面的命令依然会被执行下去,直到整个事务队列执行完成

一致性

“一致”指的是,数据在事务前后,数据是正确的,符合业务逻辑及数据库本身的规范
我说一下数据可能会不一致的情况:

  • 命令入队错误,一个客户端事务的命令在入队时,若此命令非法(不存在或语法错误),则Redis拒绝执行这个客户端端的事务。对于这个事务来说,事务执行前后的数据是一致的。
  • 出队错误,服务端在执行事务队列中的命令时,此时发生了错误,由于不存在回滚机制,同时事务也不能被中断,因此下面的命令还是会继续执行,此时事务执行完成后,可能会导致数据不一致性。
  • 服务器宕机:
    • 服务器并没有开启持久化机制,那么重启后内存中的数据是空的,这么来看数据是一致的。
    • 如果是RDB持久化模式下,那么在重启时,会恢复数据,从之前的一致性恢复到另一个一致性状态,也算是一致的。
    • 如果是AOF持久化模式下,那么在重启时,同样会恢复数据,此时的数据也是一个一致性状态

隔离性

因为Redis使用的是单线程的方式来执行事务,同一时刻,只有一个事务在执行,同时事务执行期间不会被打断,因此事务之间是具有隔离性的

持久性

Redis事务的持久性是由Redis的持久化机制来来保障的。

  • 当服务器没有开启持久化模式,那么事务不具有持久性,一旦宕机,数据就会消失
  • 当服务器在RDB持久化模式下,服务器只会在特定条件被满足时,才会执行BGSAVE命令来持久化数据,保存的是某一时刻的数据,并且异步BGSAVE下,不能保证最新数据第一时间被持久化,因此RDB模式下,事务不具有持久性
  • 当服务器在AOF持久化同步追加模式下,服务器每执行一条命令,就会将这个命令追加到AOF日志中,因此在同步AOF模式下,事务具有持久性。
  • 当处于AOF异步追加模式下,并不能保证最新的命令被立即追加到AOF日志中,因此在异步AOF模式下,事务不具有持久性

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nvidia-smi 命令详解

nvidia-smi 命令详解 1. nvidia-smi 面板解析2. 显存与GPU的区别 Reference: nvidia-smi命令详解 相关文章: nvidia-smi nvcc -V 及 CUDA、cuDNN 安装 nvidia-smi(NVIDIA System Management Interface) 是一种命令行实用程序,用于监控和管理 NVIDIA G…

Jetsonnano B01 笔记3:GPIO上拉下拉-输入输出读取

今日继续我的jetsonnano学习之路,今日学习的是GPIO的上拉下拉,输入输出的读取,文章贴出完整操作步骤过程,贴出源码。 目录 Linux常用文件命令: ls(list)列表: man: …

系统报错“由于找不到msvcp140.dll无法继续执行代码”的处理方法

我在使用电脑时,突然发现了一个错误提示:“无法启动程序,因为找不到msvcp140.dll文件”。这让我非常困惑,因为我确定这个文件应该存在于我的电脑上。但是电脑依然报错“由于找不到msvcp140.dll无法继续执行代码”,这个…

apache-activemq-5.17.1一键安装安装

下载 安装 双击InstallService.bat脚本 查看是否安装完成

C# Solidworks二次开发:创建草图文本和创建草图中心线API详解

今天要介绍的是关于如何创建草图文本的API以及创建草图中心线的API,同时把一些连带的API也会和大家介绍一下,依然是满满的干货。 (1)创建草图文本API,InsertSketchText() 这个API的输入参数如下图所示: 一…

SD、SDIO和MMC接口基础和规范介绍

在MMC规范发展的过程中出现了很多的名词,如SDHC、SDIO、SDXC等,每次看到这些不同的规范都有点懵,也很容易搞混,所以本篇文章就来介绍一下MMC规范发展过程中出现的一些新的规范,并详细地理解一下SD和SDIO。 文章目录 1 …

Postman接口测试流程

一、工具安装 ● 安装Postman有中文版和英文版,可以选择自己喜欢的版本即可。安装时重新选择一下安装路径(也可以默认路径),一直下一步安装完成即可。(本文档采用英文版本)安装文件网盘路径链接&#xff1…

哈希的应用——布隆过滤器

文章目录 前言1. 布隆过滤器提出2. 布隆过滤器概念3. 布隆过滤器的插入多哈希函数映射减少冲突结构定义及set(插入)函数实现 4. 布隆过滤器的查找test(查找)函数实现布隆过滤器允许误判 5. 布隆过滤器的适用场景6. 如何选择布隆过…

AOI软件之 CAD图纸导入功能

在这里,我不过多的解释AOI,半导体检测行业内的小伙伴自然会懂;我也不会过多解释何为diemap或者wafer-layout。因为我们本文的核心场景仅仅是cad图纸的解析和基本绘图的二次开发。而且我们紧紧是面向行业内的场景需求来说明此功能。 无图我说…

强大的JTAG边界扫描(4):STM32边界扫描应用

文章目录 1. 获取芯片的BSDL文件2. 硬件连接3. 边界扫描测试4. 总结 试想这样一个场景,我们新设计了一款集成了很多芯片的板卡,包括BGA封装的微控制器,如FPGA/MCU,还有LED、按键、串口、传感器、ADC等基本外设。 我们需要测试一下…

时序分解 | MATLAB实现基于EWT经验小波变换的信号分解分量可视化

时序分解 | MATLAB实现基于EWT经验小波变换的信号分解分量可视化 目录 时序分解 | MATLAB实现基于EWT经验小波变换的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EWT经验小波变换 包含频谱相关系数 可直接运行 Matlab代码 1.可自由设置分量个数&…

【uni-app】—2.必备软件安装

一、Node.js 安装流程 二、微信开发者工具 1.选择自己系统对应安装包下载 2. 安装 设置安装路径 三、HBuilderx 1. 根据系统下载安装包 2. 解压安装包(自定义解压路径) 3. 运行 四、安卓模拟器(夜神) 1. 下载安装包 2…

eclipse链接MySQL数据库

在MySQL官网下载驱动 MySQLhttps://www.mysql.com/cn/点击下载: 页面滚动到最下方选择社区版: 选择Java版本: 接下来,需要选择操作系统,我们选择平台独立: eclipse 接下来,我们打开eclipse,新建…

【C语言】异或(^)

一.简介 异或,英文为exclusive OR,缩写成xor 异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为: a⊕b (a ∧ b) ∨ (a ∧b) 如果a、b两个值不…

2023国赛 C题论文 蔬菜类商品自动定价与补货策略

因为一些不可抗力,下面仅展示小部分论文,其余看文末 一、问题重述 在生鲜超市管理领域,涉及一系列复杂问题,包括供应链管理、定价策略以及市场需求分析等方面。以蔬菜类商品为案例,这些商品在生鲜商超中具有较短的保…

升降压芯片

型号: SC8815 升降压电路基于SC8815实现的可调电源 2-36V连续可调,0.3-6A可调限流 原理图参考 可以观察到控制使用i2c就可以 使用参考链接 【小米120W协议转换器】私有协议转换器2.0_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1qu4y1y72F…

无人机通信协议MAVLink简介

Micro Air Vehicle Link(简称MAVLink)用于无人系统(例如,机器人、无人机、无人车、无人船和无人潜航器)。它定义了一组无人系统和地面站之间的消息交换规则。此协议广泛用于无人驾驶系统中,特别是ArduPilot和PX4无人驾驶系统,MAVLink协议提供了强大的功能,不仅用于监视…

二维码智慧门牌管理系统:高效、精准的门牌管理解决方案

文章目录 前言一、问题概述二、解决方案三、实际效果 前言 随着城市发展的日新月异,门牌标识作为城市管理的重要组成部分,也面临着诸多挑战。传统门牌的陈旧、缺失以及指示不明确等问题,已成为城市管理效率和居民生活品质的瓶颈。为解决这些…

【动手学深度学习笔记】--门控循环单元GRU

文章目录 门控循环单元GRU1.门控隐状态1.1重置门和更新门1.2候选隐状态1.3隐状态 2.从零开始实现2.1读取数据2.2初始化模型参数2.3定义模型2.4训练与预测 3.简洁实现 门控循环单元GRU 学习视频:门控循环单元(GRU)【动手学深度学习v2】 官方…

iOS App上架新规解析:如何进行App备案

摘要 本文将以iOS技术博主的身份,解析iOS App上架新规中的App备案要求。通过探讨备案对开发者和市场的影响,介绍备案流程和所需材料,帮助开发者了解如何进行App备案。 引言 近年来,移动应用市场蓬勃发展,但同时也存…