【Redis】深入理解 Redis 事务机制

文章目录

  • 前言
  • 一、回顾 MySQL 事务
    • 1.1 MySQL 事务的概念与特性
    • 1.1 MySQL 事务的管理
  • 二、对 Redis 事务的认识
    • 2.1 什么是 Redis 的事务
      • 2.1.1 Redis 事务的概念
      • 2.1.2 对 Redis 事务的深入理解
    • 2.2 Redis 事务与 MySQL 事务的比较
      • 2.2.1 事务的粒度
      • 2.2.2 ACID 属性
      • 2.2.3 并发控制
      • 2.2.4 错误处理和回滚
      • 2.2.5 应用场景
  • 三、Redis 事务相关命令
    • 3.1 MULTI
    • 3.2 EXEC
    • 3.3 DISCARD
    • 3.4 WATCH
    • 3.5 UNWATCH
  • 四、总结


前言

一、回顾 MySQL 事务

1.1 MySQL 事务的概念与特性

MySQL事务是一种用于管理数据库操作的机制,它确保一组相关的 SQL 操作要么全部成功执行,要么全部失败,从而维护数据的一致性和完整性。事务是数据库管理系统中的核心概念之一,它通常遵循 ACID 属性:

  1. 原子性(Atomicity): 事务是一个原子操作,要么全部执行成功,要么全部失败。如果其中任何一部分操作失败,整个事务将被回滚,数据库状态将保持不变。

  2. 一致性(Consistency): 事务的执行将数据库从一个一致的状态转移到另一个一致的状态。这意味着事务执行后,数据库必须满足事先定义的完整性约束。

  3. 隔离性(Isolation): 隔离性定义了多个并发事务之间的相互影响程度。不同的隔离级别提供不同的隔离程度,包括读未提交、读已提交、可重复读和串行化等级。

  4. 持久性(Durability): 一旦事务被提交,其结果将永久存储在数据库中,并在系统故障后保持不变。

1.1 MySQL 事务的管理

在MySQL中,可以使用以下关键字来管理事务:

  • BEGIN:开始一个新的事务。
  • COMMIT:提交事务,将更改保存到数据库。
  • ROLLBACK:回滚事务,撤销未提交的更改。
  • SAVEPOINT:创建一个保存点,可以在事务中的特定位置回滚。
  • SET TRANSACTION:设置事务的属性,如隔离级别。

以下是一个简单的MySQL事务示例:

BEGIN;  -- 开始事务-- 在事务中执行一些SQL操作
INSERT INTO users (id, username) VALUES (1, 'user1');
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;-- 如果一切正常,提交事务
COMMIT;

如果在事务执行期间发生错误或者需要取消事务,可以使用ROLLBACK命令来回滚事务,这将撤销所有在事务中的更改。

BEGIN;  -- 开始事务-- 在事务中执行一些SQL操作
INSERT INTO users (id, username) VALUES (2, 'user2');
-- 发生错误,回滚事务
ROLLBACK;

使用事务可以确保数据库的数据完整性,特别是在多个用户同时访问数据库时。根据具体的应用场景和需求,可以选择不同的隔离级别,以平衡并发性和一致性之间的需求。在实际应用中,正确使用事务是确保数据的一致性和可靠性的关键。

二、对 Redis 事务的认识

2.1 什么是 Redis 的事务

2.1.1 Redis 事务的概念

简单来说,Redis事务 允许将一组 Redis 命令组合成一个单独的、不可中断的操作序列。这意味着,一旦开始了一个 Redis 事务,任何在事务执行期间的其他客户端的命令都不会中断这个事务,而是会排队等待执行,直到事务被提交或取消执行。

2.1.2 对 Redis 事务的深入理解

  • Redis 事务的核心概念涉及在 Redis 服务器上创建一个称为 "事务队列" 的缓冲区。当开启一个事务后,所有与该事务相关的命令都将按顺序排队进入该队列。只有当发送执行事务的命令时,队列中的命令才会以原子的方式依次执行,这确保了这组命令要么全部成功,要么全部失败。

  • 在事务队列中,可以包括任意数量的 Redis 命令,包括读取和写入操作,以便进行一系列复杂的操作。然而,需要注意的是,Redis 事务并不支持像传统数据库那样的隔离级别和回滚机制。因此,应用程序需要自行处理错误和回滚逻辑。

  • 未收到执行命令的事务在 Redis 服务器中处于排队等待状态,虽然将命令发送给了服务器,但并没有执行,同时也不会影响其他客户端命令的正常执行。

总之,Redis 事务为提供了一种 将多个命令打包成一个原子操作的能力 ,这在需要 确保一系列操作的一致性时 非常有用。然而,它与传统数据库的事务有一些区别,特别是在隔离性和持久性方面。

2.2 Redis 事务与 MySQL 事务的比较

虽然 Redis 和 MySQL 都涉及事务的概念,但在实现和应用方面存在一些关键差异。

2.2.1 事务的粒度

Redis事务: Redis 事务通常以单个命令的粒度工作。多个 Redis 命令可以放入一个事务中,但每个命令本身是不可分割的。这允许执行一系列简单的操作,但不能跨多个 Redis 命令执行复杂的事务。

MySQL事务: MySQL 事务具有更广泛的粒度,允许跨多个 SQ L语句执行复杂的事务,包括事务的开始和结束。

2.2.2 ACID 属性

Redis事务: Redis 事务支持原子性(Atomicity)和一致性(Consistency),确保一组命令要么全部成功,要么全部失败,并在事务执行后维护数据的一致性。但 Redis 不支持传统数据库中的隔离性(Isolation)和持久性(Durability)。

MySQL事务: MySQL 事务支持完整的 ACID 属性,包括原子性、一致性、隔离性和持久性。这使得 MySQL 事务在需要严格事务完整性的应用中非常有用,如金融和电子商务系统。

2.2.3 并发控制

Redis事务: Redis 事务是单线程的,一次只能执行一个事务。这限制了并发性,因为其他客户端的命令必须排队等待执行。同时 Redis 使用乐观锁定来控制并发。

MySQL事务: MySQL 具有强大的并发控制机制,支持多个事务同时执行,可以根据需要选择不同的隔离级别,从而平衡并发性和一致性。

2.2.4 错误处理和回滚

Redis事务: Redis 事务提供了回滚操作的能力,可以使用 DISCARD 命令来取消当前事务并清除已排队的命令。但 Redis 不会自动回滚事务中的错误命令。

MySQL事务: MySQL事务支持显式的回滚操作,可以使用 ROLLBACK 来撤销已执行的事务中的命令,并恢复到事务开始之前的状态。

2.2.5 应用场景

Redis事务: Redis 事务通常用于缓存、队列、计数器等特定用例,其中需要简单的原子操作,但不强调严格的隔离性和持久性

MySQL事务: MySQL 事务广泛用于支持事务完整性的应用程序,如电子商务、金融系统等,这些应用需要强大的 ACID 支持。

总之,Redis事务和MySQL事务在粒度、ACID属性、并发控制、错误处理和应用场景等方面存在重要差异。选择使用哪种类型的事务取决于项目需求和性能要求。在某些情况下,Redis和MySQL可以共同使用,以满足不同类型的事务需求。

三、Redis 事务相关命令

Redis 事务是一种强大的功能,允许我们将一系列 Redis 命令打包在一起,以确保它们要么全部成功执行,要么全部失败。在 Redis 中,有一些关键的命令用于处理事务,包括 MULTIEXECDISCARDWATCHUNWATCH。下面将详细介绍这些命令的作用和用法。

3.1 MULTI

MULTI 命令用于开启一个事务。在执行 MULTI 命令后,Redis 会进入事务模式,接下来的命令都会被加入到事务队列中等待执行。如果执行成功,MULTI 命令会返回 “OK”。

实例:

127.0.0.1:6379> MULTI
OK

3.2 EXEC

EXEC 命令用于执行事务中的命令队列。在执行 EXEC 命令时,Redis 会按照事务队列中命令的顺序,以原子的方式依次执行这些命令。如果事务中的所有命令都执行成功,EXEC 命令返回一个包含每个命令执行结果的数组;如果有命令执行失败,事务中的所有命令都会被取消。

实例:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET k1 1
QUEUED
127.0.0.1:6379> SET k2 2
QUEUED
127.0.0.1:6379> SET k3 3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK

3.3 DISCARD

DISCARD 命令用于放弃当前事务。执行 DISCARD 命令会清空事务队列中的所有命令,之前的操作都不会被真正执行。

实例:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET k1 1
QUEUED
127.0.0.1:6379> SET k2 2
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> GET k1
(nil)
127.0.0.1:6379> GET k2
(nil)

3.4 WATCH

在执行事务时,如果某个事务中的键被其他客户端修改,可能会导致数据不一致的问题。WATCH 命令用于解决这个问题,它可以监控一组指定的键,如果这些键在事务执行前被其他客户端修改,事务将被取消。

实例:

# 客户端1 开始监控 k1
127.0.0.1:6379> WATCH k1
OK# 客户端2 修改 k1
127.0.0.1:6379> SET k1 100
OK# 客户端1 执行事务,但由于 k1 被修改,事务将被取消
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET k1 200
QUEUED
127.0.0.1:6379> EXEC
(nil)
# 获取 k1 的值
127.0.0.1:6379> GET k1
"100"

WATCH原理:

WATCH 的原理可以简单概括为以下几个步骤:

  1. 客户端执行 WATCH 命令并指定要监视的键。
  2. Redis 在服务器端创建一个监视器(Watcher)来监视这些键。监视器会记录被监视键的当前状态,通常是版本号或时间戳
  3. 客户端进入事务模式,可以执行多个命令,但这些命令不会立即执行,而是进入一个队列中等待。
  4. 在执行事务之前,客户端要求服务器检查监视器中被监视键的状态是否发生变化。这是通过比较监视器中的状态与当前键的状态来完成的。
  5. 如果监视器发现被监视键的状态在执行事务之前已经发生变化,它会通知客户端取消事务。这是乐观锁的核心思想:如果其他客户端在执行 WATCHEXEC 之间修改了被监视的键,那么事务将失败。
  6. 如果监视器未发现变化,客户端可以执行事务中的命令,这些命令会按顺序执行。

总之,WATCH 的原理是通过在服务器端创建监视器来监控一组键的状态,并在执行事务前检查这些键的状态是否发生变化。如果有其他客户端修改了被监视键,事务将被取消,以确保数据的一致性。这使得 Redis 能够在并发环境中实现事务操作,而不会引发竞态条件等问题。

3.5 UNWATCH

UNWATCH 命令用于取消对键的监控,是 WATCH 命令的逆操作。如果你不再需要监控某些键,可以使用 UNWATCH 来取消监控。

127.0.0.1:6379> set key 1
OK
127.0.0.1:6379> WATCH key
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key 2
QUEUED
127.0.0.1:6379> set key 3
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> UNWATCH
OK
127.0.0.1:6379> 

以上就是 Redis 事务相关命令的详细介绍。通过合理使用这些命令,就可以构建出安全、可靠的事务操作,确保数据的一致性和完整性。当然,在使用事务时,需要根据具体的业务需求和情况来决定是否使用监控命令 WATCH

四、总结

在本文中,深入探讨了Redis事务的概念和相关命令,以及 Redis 事务与 MySQL 事务的比较。以下是本文的主要要点总结:

  1. Redis 事务的核心概念: Redis 事务允许将多个 Redis 命令打包成一个单一、不可中断的操作序列。这确保了这些命令要么全部成功执行,要么全部失败。

  2. Redis 事务相关命令: Redis 提供了一组关键命令来管理事务,包括MULTI(开始事务)、EXEC(提交事务)、DISCARD(取消事务)、WATCH(监视键变化)、和UNWATCH(取消监视)。

  3. Redis 事务与 MySQL 事务的比较: Redis 事务与 MySQL 事务在事务粒度、ACID 属性、并发控制、错误处理和应用场景等方面存在不同。Redis 事务通常用于简单的原子操作,而 MySQL 事务支持更广泛的 ACID 属性,适用于需要强大事务完整性的应用。

  4. Redis 事务的限制: Redis 事务不支持传统数据库中的隔离级别和持久性,需要应用程序自行处理错误和回滚逻辑。

在选择使用 Redis 事务还是 MySQL 事务时,应根据项目需求和性能要求权衡不同的特性和限制。了解 Redis 事务的工作原理和使用方式,可以帮助我们更好地利用 Redis 的事务功能。

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

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

相关文章

(图论) 827. 最大人工岛 ——【Leetcode每日一题】

❓ 827. 最大人工岛 难度:困难 给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相连的 1 形成。 示例 1: 输入: grid [[1, 0]…

解决Sublime Text用浏览器打开没反应

点击Open in Browser用浏览器打开没反应怎么解决? 点击Browse Packages 会跳转到这个文件夹页面 打开User文件夹 在文件中添加下面代码即可,chrome是默认打开浏览器,可以自定义为你想用的浏览器 { "browser": "chrome" }

Centos7 安装部署 Kubernetes(k8s) 高可用集群

1:基础环境准备 宿主机系统集群角色服务器IP主机名称容器centos7.6master192.168.2.150ks-m1dockercentos7.6master192.168.2.151ks-n1dockercentos7.6master192.168.2.152ks-n2docker 1.1 服务器初始化及网络配置 VMware安装Centos7并初始化网络使外部可以访问*…

华为HCIA学习(一)

文章目录 一.根据考试题总结知识点(一题一点)二.上午学习三.下午学习四.今天只做了70题,需要的可以找我 一.根据考试题总结知识点(一题一点) 二.上午学习 ① VRP系统是VRP是华为公司从低端到高端的全系列路由器、交换…

Rust swap

文章目录 /*fn swap<a>(a: &a mut String, b:&a mut String){let tmp *a;*a *b;*b tmp;}let mut a "aaa".to_string();let mut b "bbb".to_string();swap(&mut a, &mut b);*/let mut a 111;let mut b 222;fn swap<a>(a…

探讨基于IEC61499 的分布式 ISA Batch 控制系统

ISA SP88 是批次过程控制的标准&#xff0c;对应的IEC标准是IEC 61512。该标准中一个重要的部分是配方管理&#xff08;Recipe Management&#xff09;。 所谓配方&#xff0c;是根据批量产品的要求&#xff0c;材料设定加工工艺&#xff0c;加工流程和参数。类似于传统制造业的…

Ubuntu 安装redis数据库,并设置开机自启动

1、下载安装包 wget http://download.redis.io/releases/redis-7.0.9.tar.gz 2、解压 tar -zxvf redis-7.0.9.tar.gz 3、复制到解压缩的包移动到/usr/local/ sudo mv ./redis-7.0.9 /usr/local/ 4、编译 cd /usr/local/redis-7.0.9 sudo make 5、测试: 时间会比较长&#xff0…

层次聚类分析

1、python语言 from scipy.cluster import hierarchy # 导入层次聚类算法 import matplotlib.pylab as plt import numpy as np# 生成示例数据 np.random.seed(0) data np.random.random((20,1))# 使用树状图找到最佳聚类数 Z hierarchy.linkage(data,methodweighted,metric…

千呼万唤openGauss资源池化系列培训来了

应openGauss广大用户要求&#xff0c;社区于近期推出openGauss资源池化培训系列。 关于资源池化 资源池化是openGauss 5.0.0 推出的重点特性&#xff0c;是openGauss基于内存池化和共享存储实现的数据库集群。数据在集群的计算节点内存、共享存储中实现共享。应用可以任意节点…

uni-app 之 解决u-button始终居中问题

uView中u-button始终居中问题如何解决的简单方法&#xff1f; 1&#xff1a;给该元素margin-right: 0;可以达到向右靠齐&#xff1b; 2&#xff1a;给该元素的父元素设置float: right image.png <u-button style"width: 50px; margin-left: 0;" plain"t…

基于Python+Pytest+Playwright+BDD的UI自动化测试框架

一、框架介绍 本框架是基于Python+Pytest+Playwright+BDD的UI自动化测试框架。 git地址: https://gitlink.org.cn/floraachy/uiautotest_playwright.git项目参与者: floraachy个人主页: https://www.gitlink.org.cn/floraachy测试社区地址: https://www.gitlink.org.cn/zone/…

DAQ高频量化平台:引领Ai高频量化交易模式变革

近年来&#xff0c;数字货币投资市场掀起了一股热潮&#xff0c;以&#xff08;BTC&#xff09;为代表的区块链技术带来了巨大的商业变革。数字资产的特点&#xff0c;如无国界、无阶级、无门槛、高流动性和高透明度&#xff0c;吸引了越来越多的人们的关注和认可&#xff0c;创…

k8s储存卷

卷的类型 In-Tree存储卷插件 ◼ 临时存储卷 ◆emptyDir ◼ 节点本地存储卷 ◆hostPath, local ◼ 网络存储卷 ◆文件系统&#xff1a;NFS、GlusterFS、CephFS和Cinder ◆块设备&#xff1a;iSCSI、FC、RBD和vSphereVolume ◆存储平台&#xff1a;Quobyte、PortworxVolume、Sto…

Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发

Dubbo3程序的初步开发 Dubbo3升级的核心内容 易⽤性 开箱即⽤&#xff0c;易⽤性⾼&#xff0c;如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富&#xff0c;基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能⼒。更加完善了多语言支持&#xff08;GO PYTHON R…

指针笔试题讲解(让指针变得简单易懂)

数组名的理解 : 数组名就是首元素地址 但是有两个例外&#xff1a; 1. sizeof&#xff08;数组名&#xff09;这里的数组名表示整个数组的大小&#xff0c;sizeof&#xff08;数组名&#xff09;计算的是整个数组的大小&#xff0c;单位是字节 2. &数组名 这里的数组…

【音视频】ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …

安防监控系统/视频云存储/监控平台EasyCVR服务器解释器出现变更该如何修改?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

python excel复制数据保留单元格格式(.xls.xlsx)

最近帮朋友开发一个数据excel根据条件动态过率的功能.读取生成用pandas很方便,但是这里有一点比较麻烦的是得保留原来的单元格格式.这点操作起来就要麻烦一点了.下面总结了.xlsx和.xls处理 1.xlsx 文件处理 xlsx文件处理可以使用openpyxl库进行处理,比较简单,流程如下 1.获取…

自定义事件的使用

绑定自定义事件 在Vue.js中&#xff0c;你可以使用自定义事件来实现组件之间的通信。自定义事件允许你在一个组件中触发事件&#xff0c;并在另一个组件中监听并响应该事件。以下是自定义事件的使用方法&#xff1a; 定义一个触发事件的组件&#xff1a; <template>&l…

蓝桥杯每日一题2023.9.15

蓝桥杯2022年第十三届省赛真题-修剪灌木 - C语言网 (dotcpp.com) 题目描述 爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木&#xff0c;让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始&#xff0…