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

从入门到精通【Redis】理解Redis事务

文章目录

    • 📕1. 什么是Redis事务
    • 📕2. 事务操作
        • ✏️2.1 MULTI
        • ✏️2.2 EXEC
        • ✏️2.3 DISCARD
        • ✏️2.4 WATCH
        • ✏️2.5 UNWATCH

特此注明 :
Designed By :长安城没有风
Version:1.0
Time:2025.09.30
Location:辽宁 · 大连

📕1. 什么是Redis事务

Redis 的事务和 MySQL 的事务概念上是类似的,都是把⼀系列操作绑定成⼀组,让这⼀组能够批量执⾏。但是 Redis 的事务和 MySQL 的事务有一下几种区别:

  1. 弱化的原⼦性 : redis 没有 “回滚机制”,只能 “批量执⾏”,不能做到 “⼀个失败就恢复到初始状态”。
  2. 不保证⼀致性 : 不涉及 “约束”,也没有回滚,MySQL 的⼀致性体现的是运⾏事务前和运⾏后,结果都是合理有效的,不会出现中间⾮法状态。
  3. 不需要隔离性 : 也没有隔离级别。因为不会并发执⾏事务 (redis 单线程处理请求)。
  4. 不需要持久性 : 是保存在内存的。是否开启持久化,是redis-server ⾃⼰的事情,和事务⽆关。

Redis 事务本质上是在服务器上搞了⼀个 “事务队列”,每次客⼾端在事务中进⾏⼀个操作,都会把命令先发给服务器,放到 “事务队列” 中,但是并不会⽴即执⾏,⽽是会在收到 EXEC 命令之后,才真正执⾏队列中的所有操作(Redis 的事务的功能相⽐于 MySQL 来说,是弱化很多的,只能保证事务中的这⼏个操作是 “连续的”,不会被别的客户端 “加塞”)。

📕2. 事务操作

✏️2.1 MULTI

MULTI:开启⼀个事务,执⾏成功返回 OK。

127.0.0.1:6379> MULTI
OK
✏️2.2 EXEC

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

每次添加⼀个操作,都会提⽰ “QUEUED”,说明命令已经进⼊客户端的队列了,真正执⾏ EXEC 的时候,客户端才会真正把上述操作发送给服务器。

✏️2.3 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
✏️2.4 WATCH

WATCH:监控客户端一组具体的key

  1. 当开启事务的时候,如果对 watch 的 key 进⾏修改,就会记录当前 key 的 “版本号”。(版本号是个简单的整数,每次修改都会使版本变⼤,服务器来维护每个 key 的版本号情况)
  2. 在真正提交事务的时候,如果发现当前服务器上的 key 的版本号已经超过了事务开始时的版本号,就会让事务执⾏失败。(事务中的所有操作都不执⾏)
客户端1
127.0.0.1:6379> watch k1 # 开始监控 k1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 100 # 进⾏修改, 从服务器获取 k1 的版本号是 0. 记录 k1 的版本号. (还没真修改呢, 版本号不变)
QUEUED
127.0.0.1:6379> set k2 1000 
QUEUED客户端2
127.0.0.1:6379> set k1 200 # 修改成功, 使服务器端的 k1 的版本号 0 -> 1
OK客户端1
127.0.0.1:6379> EXEC # 真正执⾏修改操作, 此时对⽐版本发现, 客⼾端的 k1 的版本号是 0, 服务器上的版本号是 1, 版本不⼀致! 说明有其他客⼾端在事务中间修改了 k1 !!! 
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> get k2
(nil)
# 此时说明事务已经被取消了,这次提交的所有命令都没有执⾏。
✏️2.5 UNWATCH

UNWATCH:取消对 key 的监控,相当于 WATCH 的逆操作。

http://www.dtcms.com/a/423515.html

相关文章:

  • Android16 wifi启动后自动连接的第一个wifi分析和修改
  • 【C++STL :vector类 (一) 】详解vector类的使用层vector实践:算法题练习
  • 做淘宝用那些网站发货如何进行电子商务网站推广
  • 语言是火,视觉是光:论两种智能信号的宿命与人机交互的未来
  • Java应用实例:三角形判断(向量叉积、海伦公式)、分数序列求和
  • Go Modules 包管理 (Go 模块)
  • Go基础(⑦实例和依赖注入)
  • 网站建设绩效考核方案ppt网页开发背景与意义
  • 【数据结构】基础知识
  • Fluttercon EU 2025 :Let‘s go far with Flutter
  • go-commons/stringutils 与标准库 strings 对比
  • 长春网站推广方式seo综合查询国产
  • 探索3D空间的视觉基础模型系列
  • 自建营销型企业网站怎么建设公益网站
  • C# 基于halcon的视觉工作流-章40-OCR训练识别
  • OCR API-智能文字识别技术,从“手动录入”到“智慧识别”的跨越
  • 收到网站代码后怎么做设计素材模板
  • JWT (JSON Web Token) 综合指南
  • 【笔记】在WPF中Binding里的详细功能介绍
  • html 滚动条相关开发经验总结
  • C++基础:(六) 内存管理深度解析:从分布到实现
  • BUUCTF get_started_3dsctf_2016 wp
  • 成都网站制作设计网页设计实训报告心得体会
  • Linux 进程创建与控制详解
  • 万网x3主机l系统放两个网站手机制作ppt
  • XML语言解析
  • AJAX XML:深入解析与实际应用
  • 十大网站在线观看深圳互联网推广公司
  • 价值流智能时代:DevOps平台如何成为企业高效交付的核心引擎?
  • Vue Router 动态路由完全指南:灵活掌控前端路由