当前位置: 首页 > news >正文

Redis事务的理解

介绍

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模式下,事务不具有持久性

相关文章:

Redis事务的理解

介绍 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。 事务提供了一种将多个命令请求打包,然后一次性、按照顺序地执行多个命令的机制,并且在事务执行期间,服务器不会因为其他客户端请求而中断事务的执行功能,他会将事务中的…...

PostgreSQL安装异常,服务无法启动导致创建服务器超时

win上安装pg后无法创建服务器,提示创建超时,发现服务列表里面pg15服务 并没有启动,启动服务器发现服务不了,截图忘记截了,复现不了,解决方法是 换个身份,然后继续启动,然后就可以在…...

汽车电子系统网络安全解决方案

声明 本文是学习GB-T 38628-2020 信息安全技术 汽车电子系统网络安全指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 汽车电子系统网络安全范围 本标准给出了汽车电子系统网络安全活动框架,以及在此框架下的汽车电子系统网络安全活动…...

切片机制和MR工作机制

切片机制 默认的切片大小和块大小一致,切片的个数决定了MapTask的个数。 数据倾斜问题:如果某个切片的大小太小,会浪费了MapTask申请的CPU资源。 如果剩余数据长度大于128*1.1, 就切片成2份,否则就不进行切分了。 InputFormat基…...

【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路

postgresql 基础架构 ​专栏内容: postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&…...

是的,决定放弃算法去机器学习了

可是梦想啊!~她永存心间!!! 我啊~本是执着于这些算法的怪咖,梦想是icpc,ccpc~ 可是啊~ 在以后的科研和工作中,这些算法很多都是用不到的,学习算法更重要的目的是锻炼编程能力和分析…...

Python 03(循环语句)

Python03(循环语句) 文章目录 Python03(循环语句)一、while语句二、while实现猜数字三、while循环的嵌套while循环嵌套实例需求: 四、for循环1、什么 是for循环2、语法3、执行流程4、for循环的基本使用5、range()函数6…...

安科瑞铁塔基站能耗监控解决方案

安科瑞 华楠 1 背景概述 5G发展,基站先行。5G基站的选址建设,是保证5G信号覆盖的基础,因此5G基站建设是5G产业布局的一部分,也是5G成熟的基础。 2G、3G、4G均是低频段信号传输,宏基站几乎能应付所有的信号覆盖。但由…...

操作系统-线程复用

操作系统执行线程复用的过程涉及到线程调度和管理。线程复用是指操作系统能够有效地重用现有的线程来执行新的任务,而不必每次都创建新线程。这有助于减少线程创建和销毁的开销,提高系统性能。下面是操作系统如何执行线程复用的关键步骤: 线程…...

通达信自定义副图行业指标K线指标 HYZS_QD

行业指数:HY_INDEXC,NODRAW; DRAWKLINE(HY_INDEXH,HY_INDEXO,HY_INDEXL,HY_INDEXC); MA5:MA(HY_INDEXC,5),COLORWHITE; {MA10:MA(HY_INDEXC,10),COLORYELLOW,LINETHICK2}; DRAWTEXT_FIX(1,1,1,1,STRCAT(STRCAT(CON2STR(HY_INDEXADV,0),/),STRCAT(CON2STR(HY_INDEXDEC,0), ))),…...

MDK-Keil AC6 Compiler屏蔽特定警告

最近在使用STM32CubeMX生成MDK工程是,使用了 AC6 版本的编译器进行编译代码,然后发现了一些警告,但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告,这里记录一下。 1. Keil AC6屏蔽特定警告 遇到的警告如下&#x…...

计算机网络的故事——了解Web及网络基础

了解Web及网络基础 文章目录 了解Web及网络基础一、使用 HTTP 协议访问 Web二、HTTP 的诞生三、网络基础 TCP/IP四、与 HTTP 关系密切的协议 : IP、TCP 和 DNS 一、使用 HTTP 协议访问 Web 根据Web浏览器指定的URL,从对应的服务器中获取文件资源,从而显…...

[系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取详解

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…...

自动驾驶——估计预瞄轨迹YawRate

1.Introduction 在ADAS控制系统中,通常根据预瞄距离x去估计横向距离y,有如下关系: y a0 a1 x a2 * x^2 a3 * x^3 ,那么现在有个需求,希望根据上述x和y的关系,去估计规划预瞄轨迹yawRate 2.How to es…...

PMP证书考下来要多少费用?

PMP考试共有三项费用:分为考前费用、考后费用和续证费用。 第一项是考前费用: 1、培训费用,在英文报名时需要填写培训公司名称和35学时的培训证明。一般的培训公司收费不一,有些公司大概是三千元左右,而有些公司可能…...

C动态分配

动态分布与静态发布: 静态分配 1、 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区,一般以数组的形式。 4、 按计划分配。 动态分配 1、在程序运…...

C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)

了解程序环境和预处理 前言:一、程序环境二、编译链接2.1 翻译环境2.2 编译的几个阶段2.3 运行环境 三、预处理3.1 预定义符号3.2. #define的使用3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##的用途3.2.5 带副作用的宏参数3.2.6…...

Docker部署EMQX

1、简介 EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。 Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。 MQTT 是轻量的 (Lightweight)、发布订阅模式 (Pu…...

Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon

Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon 目前主流的负载均衡方案有两种,一种是集中式均衡负载,在消费者与服务提供者之间使用独立的代理方式进行负载,比如F5、Nginx等。另一种则是客户端自己做负载均衡,根据自己的请求做负载,Ribbon就属于客户端自…...

好玩的js特效

记录一些好玩的js特效 1、鱼跳跃特效 引入jquery:https://code.jquery.com/jquery-3.7.1.min.js 源码如下&#xff1a; <!--引入jquery--> <script src"https://code.jquery.com/jquery-3.7.1.min.js"></script> <!--引入跳跃源码--> <s…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...