Redis 7.x 系列【18】事务

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 概述
    • 2. 命令
      • 2.1 MULTI
      • 2.2 EXEC
      • 2.3 DISCARD
      • 2.4 WATCH
      • 2.5 UNWATCH
    • 3. 事务中的错误
    • 4. 和数据库事务的区别
      • 4.1 原子性
      • 4.2 隔离性
      • 4.3 持久性
      • 4.4 一致性
    • 5. 脚本和事务

1. 概述

官方文档

Redis 事务:允许在单个步骤中执行一组命令,其核心命令包括 MULTIEXECDISCARDWATCH

Redis 事务提供了两个重要的保证:

  • 所有事务中的命令都是串行化执行的,按顺序逐一执行。在事务执行过程中,不会在命令执行的中间阶段响应其他客户端的请求,这确保了命令作为单个隔离操作执行。
  • EXEC 命令触发事务中所有命令的执行:
    • 如果客户端在调用 EXEC 命令之前在事务上下文中失去了与服务器的连接,那么所有操作都不会执行。
    • 一旦调用 EXEC 命令,所有操作将被执行。
    • 在使用AOF时,确保使用单个系统调用将事务写入磁盘。如果Redis服务器崩溃或被系统管理员强制终止,可能会导致仅部分操作被记录。会在重新启动时检测到此条件,并报错退出。通过使用 redis-check-aof 工具,可以修复追加写入文件,删除部分事务,以便服务器能够重新启动。

自版本 2.2 起,Redis在上述两个保证之外提供了额外的保证,采用了乐观锁的方式,与检查和设置(CAS)操作非常类似。

注意Redis 不支持事务的回滚操作,因为支持回滚会对 Redis 的简单性和性能产生影响。

2. 命令

MULTIEXECDISCARDWATCHRedis 事务相关的命令。

2.1 MULTI

MULTI 命令用于开启一个事务,它总是返回 OK MULTI 执行之后, 客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被执行, 而是被放到一个队列中, 当 EXEC命令被调用时, 所有队列中的命令才会被执行。

当客户端处于事务状态时, 所有传入的命令都会返回一个内容为 QUEUED 的状态回复, 这些被入队的命令将在 EXEC 命令被调用时执行。

示例:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1 
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED

2.2 EXEC

EXEC 命令用于执行事务队列内的所有命令,返回值为事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil

示例:

127.0.0.1:6379(TX)> exec 
1) OK
2) OK

2.3 DISCARD

DISCARD 命令用于取消事务,放弃执行事务队列内的所有命令,恢复连接为非事务模式。

示例:

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> discard 
OK

2.4 WATCH

WATCH 命令用于监视一个或多个 key ,当被 WATCHkey 被修改时,事务才会被执行。如果在事务执行期间这些键被其他客户端修改,那么该事务执行会被打断。

基本语法:

WATCH key [key ...]

示例,客户端监视 k1
在这里插入图片描述
打开另外一个客户端,对 k1 进行修改操作:
在这里插入图片描述
之前的客户端执行事务操作时,EXEC 返回 nil
在这里插入图片描述

注意事项:

  • Redis 6.0.9之前的版本中,过期的键不会导致事务中止。
  • WATCH 命令仅在事务中使用才有意义,因为它是为了配合事务而设计的乐观锁机制。
  • WATCH 可以被调用多次,从调用开始,直到EXEC调用结束。
  • 被监视的 key 在事务执行之前,会被Redis服务器记录下来,并在执行 EXEC 命令时检查这些键是否被修改。
  • 如果在 WATCHEXEC 之间发生了其他客户端的写操作,事务将会失败。此时,客户端可以根据返回值 nil 来判断事务执行是否成功。
  • 一旦执行 EXEC 或者关闭客户端连接,所有的 WATCH 都会被取消。
  • WATCH 命令在处理并发操作时非常有用,它可以帮助保证事务的原子性和一致性,是实现复杂事务逻辑的重要组成部分。

使用场景:

  • 实现乐观锁:WATCH 命令允许在事务执行前检查键是否被其他客户端修改,从而避免并发冲突,是实现乐观锁的重要手段之一。
  • 事务中的条件控制:当事务需要根据某些条件来执行或取消执行时,可以使用 WATCH 来检查条件是否满足。

2.5 UNWATCH

UNWATCH 命令用于取消 WATCH 命令对所有 key 的监视。如果执行过 EXECDISCARD,会自动取消监视,无需再执行 UNWATCH

示例:

localhost:0>UNWATCH
"OK"

3. 事务中的错误

Redis 事务中,可能会遇到两种类型的命令错误:

  • 在调用EXEC之前,某些命令可能会失败无法入队。例如,命令可能存在语法错误,或者可能出现关键条件,例如内存不足等。
  • 在调用EXEC之后,某些命令可能会失败。例如,可能对一个键执行了与其值类型不符的操作,例如对字符串值执行列表操作等。

Redis 2.6.5 开始,服务器会在累积命令期间检测到错误。如果发现错误,它将拒绝执行事务并在EXEC期间返回错误,丢弃该事务。而在EXEC之后发生的错误不会以特殊方式处理,即使事务中的某些命令失败,其他所有命令仍将被执行。

示例,在调用EXEC之前的命令存在语法错误时,不会被添加到队列:

localhost:0>MULTI
"OK"
localhost:0>INCR a b c
"ERR wrong number of arguments for 'incr' command"

示例,命令的语法都是正确的,在调用EXEC之后,由于 LPOP 操作的对象是一个字符串,所以这个命令执行失败,但是队列中的其他命令仍会被执行:

localhost:0>MULTI
"OK"
localhost:0>SET a abc
"QUEUED"
localhost:0>LPOP a
"QUEUED"
localhost:0>SET b efg
"QUEUED"
localhost:0>EXEC
 1)  "OK"
 2)  "WRONGTYPE Operation against a key holding the wrong kind of value"
 3)  "OK"

4. 和数据库事务的区别

关系型数据库事务:事务保证一系列操作要么全部成功,要么全部失败,如果某一步出现了异常,数据就会回滚,把之前的操作撤销。数据库事务需要满足四大特性(简称ACID),即原子性隔离性持久性一致性,才能保证数据正确性。

4.1 原子性

关系型数据库事务具有严格的原子性,要么所有操作都执行成功并永久保存(提交),要么所有操作都不执行(回滚)。

Redis 事务允许一组命令作为一个原子操作进行执行。但是,不是严格的原子性,如果在执行期间发生错误,部分命令可能已经执行,而另一部分可能未执行。

4.2 隔离性

关系型数据库事务通过锁和多版本并发控制(MVCC)等机制来实现不同事务之间的隔离性,例如读未提交、读已提交、可重复读和串行化等级别。

Redis事务提供了一定的隔离性,但没有像传统数据库那样严格的隔离级别。不同客户端的事务可能会相互干扰,需要通过WATCH命令显式地实现乐观锁机制。

4.3 持久性

关系型数据库事务中,事务提交后,数据会被持久化到磁盘,保证数据不会丢失。

Redis 通过持久化机制来实现持久性,但在事务提交时并没有严格保证数据已经永久保存。

4.4 一致性

关系型数据库事务中,发生错误时,数据库可以进行回滚操作,保证事务执行前后数据的一致性。

Redis事务中的某个命令执行失败,后续的命令仍然会继续执行,不会回滚已经执行的命令,无法保证一致性。

5. 脚本和事务

从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。 并且一般来说, 使用脚本要来得更简单,并且速度更快。

因为脚本功能是 Redis 2.6 才引入的, 而事务功能则更早之前就存在了, 所以 Redis 才会同时存在两种处理事务的方法。

不过官方并不打算在短时间内就移除事务功能, 因为事务提供了一种即使不使用脚本, 也可以避免竞争条件的方法, 而且事务本身的实现并不复杂。

不过在不远的将来, 可能所有用户都会只使用脚本来实现事务也说不定。 如果真的发生这种情况的话, 那么将废弃并最终移除事务功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网平台产品介绍

中服云物联网平台在功能、性能、易用性方面有较大的提升,成为业界领先的工业物联网平台。主要包含8大能力:数据采集与控制、基础物联组件集、快速开发工具集、数据集管理、数据处理与分析、平台配置管理、手机端小程序、二次开发接口。 产品配图&#x…

EDUSRC-我与xx职院的爱恨情仇(教育漏洞挖掘)

一、人生中的第一个漏洞 2024.1月的时候,当时看朋友挖到了一个名校的漏洞,特别羡慕,我也想挖,但是当时什么都不会,就只好在网上搜edusrc挖掘思路、edusrc挖掘教程等等,边学边挖,边挖边学。 一开…

电源管理芯片PMIC的编程

1.概述 市面上的高端PMIC芯片,功能都非常丰富,输出电压可调节、故障监控、启动配置、MCU认证等,用户可以根据项目实际需求,进行灵活的配置,让PMIC芯片的功能最大限度的满足项目需求。 PMIC芯片通常支持多种编程接口&a…

IMU用于仿生水下机器人姿态估计

近期,自中国农业大学的研究团队从海豚身上汲取灵感,成功研发出一种创新性的双腱驱动机器人海豚尾鳍。这项创新性的设计不仅能够实现全方向运动,还能精细地模拟海豚的推力特性,揭示了其背后隐藏的力学秘密。 这款机器人尾鳍设计独特…

深入编译与体验开源车载Linux操作系统AGL

随着汽车行业的智能化和互联化趋势日益明显,车载系统作为汽车的重要组成部分,其性能和功能也受到了越来越多的关注。Linux作为一款开源的操作系统,具有稳定性高、安全性强、可定制性好等优点,因此成为了车载系统领域的热门选择。 …

Aavegotchi的Gotchiverse新地图: 沉睡的野兽即将苏醒!

Gotchi 守护者们,准备好了,因为我们要大开杀戒了! 加入我们吧(后果自负!),我们将深入Gotchiverse,前往奥姆夫山--我们虚拟世界中所有 FOMO 的炽热源头。 请继续阅读,了解…

户用分布式光伏项目开发模式

随着全球对可再生能源的重视和技术的不断进步,分布式光伏发电作为一种清洁、高效、可再生的能源形式,正逐渐成为新能源发展的重要方向。户用分布式光伏项目,作为分布式光伏发电的重要组成部分,其开发模式对于推动光伏产业的普及与…

python怎么样将一段程序无效掉

1、python中可以用注释屏蔽一段语句,具体方法如下,首先打开一段python的示例程序: 2、然后单行注释的方法是在语句前面加上#,程序运行后添加注释的地方的语句会被自动跳过,这里可以看到将打印变量a的语句添加注释就没有…

动态校验列表数据方案

背景:当select 选择A 的时候是必填,选B的时候是非必填 那么我们需要监听 selec 变化时候对 列表的 :edit-rules“validRulesList” 进行重新赋值必填校验的true, (跟对列表内上传文件,对列表文件进行赋值名字一样道理,…

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署) 简介 OpenEBS 是一种开源云原生存储解决方案。OpenEBS 可以将 Kubernetes 工作节点可用的任何存储转化为本地或复制的 Kubernetes 持久卷。OpenEBS 帮助应用和平台团队轻松地部署需要…

后端之路——文件本地上传

一、基础原理 文件上传是一个很基础的知识点&#xff0c;尤其是本地上传&#xff0c;在现实开发基本都是云上传&#xff0c;但是作为一个基础要简单了解一下 首先前端我就不多讲解了&#xff0c;网页开发里用<form>表单可以上传文件&#xff0c;只需要加上这三属性&…

【HarmonyOS NEXT】鸿蒙如何动态添加组件(NodeController)

NodeController用于实现自定义节点的创建、显示、更新等操作的管理&#xff0c;并负责将自定义节点挂载到NodeContainer上。 说明 本模块首批接口从API version 11开始支持 当前不支持在预览器中使用NodeController。 导入模块 import { NodeController } from "ohos…

面试官:JVM调优,主要针对是哪一个区域?JVM内存结构是怎样的?

作为一个Java程序员&#xff0c;在日常的开发中&#xff0c;不必像C/C程序员那样&#xff0c;为每一个内存的分配而操心&#xff0c;JVM会替我们进行自动的内存分配和回收&#xff0c;方便我们开发。但是一旦发生内存泄漏或者内存溢出&#xff0c;如果对Java内存结构不清楚&…

【情绪ABC理论】你为什么生气?清理一下情绪垃圾吧!

心理学有一个著名的情绪ABC理论&#xff0c;认为人的情绪并不是由事件本身引起的&#xff0c;而是由对事件的看法所导致&#xff0c;情绪的困扰某种程度与我们的不合理信念有关。在无法改变事物本身时&#xff0c;转变自己的认识有助于保持阳光心情。 什么是ABC法则&#xff1…

2024最全前端面试系列(计算机网络)(非科班出身最薄弱的环节)

2020最全前端面试系列&#xff08;CSS&#xff09; 2020最全前端面试系列&#xff08;VUE&#xff09; 2020最全前端面试系列&#xff08;浏览器原理&#xff09; 2020最全前端面试系列&#xff08;数据结构&#xff09; 常见状态码 | | 类别 | 原因短语 | | — | — | —…

申请SSL证书 SSL是如何保护网站安全的

随着互联网的不断发展&#xff0c;网络安全问题日益凸显&#xff0c;特别是在数据传输和存储方面。为了保护网站和用户的数据安全&#xff0c;SSL&#xff08;安全套接层&#xff09;技术应运而生&#xff0c;成为了保护网站安全的重要工具。本文将详细介绍SSL如何保护网站安全…

2024-07-04 base SAS programming学习笔记8(HTML)

当使用ODS来进行结果或数据集输出的时候&#xff0c;可以同时设置多个ODS 命令&#xff0c;同时输出到多个不同的文件。使用_ALL_ 表示关闭所有的ODS输出窗口&#xff0c;比如&#xff1a; ods html file(body)"html-file-pathname"; ods html file"pdf-file-pa…

React、JSX简介、渲染列表、基础和复杂的条件渲染

目录 一、简介 1、搭建环境 2、回到项目&#xff08;VScode&#xff09; 3、项目核心渲染路径 4、网站资料&#xff08;启动项目的方法&#xff09; 二、JSX 三、实现渲染列表 四、实现条件渲染 五、实现复杂条件渲染 一、简介 1、搭建环境 npx creat-react-app reac…

【 VIPKID-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

Soildwoker学习(特征学习4)

本节学习内容&#xff1a; 1、异性孔向导 2、螺纹孔的选择 M6 六角圆柱头螺钉 M6 螺纹孔 3、线性阵列 4、基准轴 5、镜像 特征镜像 实体镜像