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

Redis 事物

基本概念

Redis 事务是一种机制,允许用户将多个命令打包在一起,然后一次性、顺序地执行这些命令。它类似于关系型数据库中的事务,但 Redis 的事务更轻量级且功能相对简单。以下是关于 Redis 事务和 MySQL 事务的区别:

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

 

Redis 事务本质上是在服务器上搞了⼀个 "事务队列"。每次客⼾端在事务中进⾏⼀个操作,都会把命令先发给服务器,放到 "事务队列" 中(但是并不会⽴即执⾏),⽽是会在真正收到 EXEC 命令之后,才真正执⾏队列中的所有操作。

Redis 事务的使用

Redis 提供了一组命令来支持事务操作,主要包括以下命令:

  • MULTI:开始一个事务。

  • EXEC:执行事务中的所有命令。

  • DISCARD:取消事务,丢弃事务队列中的所有命令。

  • WATCH:监视一个或多个键,如果在事务执行之前这些键的值被修改了,则事务会失败。

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

 

 事务的执行流程

  1. 命令入队:在调用 MULTI 之后,所有执行的命令不会立即执行,而是被放入一个队列中。

  2. 执行事务:当执行 EXEC 命令时,Redis 会顺序执行队列中的命令。

  3. 取消事务:如果在执行 EXEC 之前调用 DISCARD,则事务队列中的所有命令会被丢弃。

示例1
 
示例2
 
示例3
我们先在一个客户端中使用 watch 监视一个 key,而后使用 multi 开启事务
而后打开第二个客户端改变 key 的值
这时打开第一个客户端使用 exec 执行事务,这时事务就会返回 nil,表示执行失败,这就是 watch 起到的作用,监视一个或多个键,如果在事务执行之前这些键的值被修改了,则事务会失败。

watch 的实现原理

  • 当开启事务的时候, 如果对 watch 的 key 进⾏修改, 就会记录当前 key 的 "版本号"。(版本号是个简单的整数, 每次修改都会使版本变⼤. 服务器来维护每个 key 的版本号情况)
  • 在真正提交事务的时候, 如果发现当前服务器上的 key 的版本号已经超过了事务开始时的版本号, 就会让事务执⾏失败. (事务中的所有操作都不执⾏).
 
 

 

相关文章:

  • React 第二十六节 <Profiler></Profiler> 的用途使用方法
  • 【零基础学Mysql】常用函数讲解,提升数据操作效率的利器
  • 2025年 Java 面试八股文
  • 鸿蒙Harmony-UIAbility内状态-LocalStorage详细介绍
  • 【数据结构】 栈和队列
  • Unity DeepSeek API 聊天接入教程(0基础教学)
  • 聊一聊vue如何实现角色权限的控制的
  • JavaBean
  • 【Elasticsearch入门到落地】8、RestClient操作索引库-基础介绍及导入demo
  • 【OpenCV】入门教学
  • Spring 和 Spring MVC 的关系是什么?
  • python知识和项目经验
  • 案例-06.部门管理-根据ID查询
  • Python基于Flask的豆瓣电影数据分析可视化系统(附源码,文档说明)
  • 国产编辑器EverEdit - “切换文件类型”的使用场景
  • 力扣 470. 用 Rand7() 实现 Rand10() 拒绝采样 等概率随机数生成
  • 2.【BUUCTF】[极客大挑战 2020]Roamphp1-Welcome
  • 网易雷火游戏测试开发1面面经(带脑图)
  • 权限五张表
  • React入门 - 0.React简介
  • 王文涛会见德国汽车工业协会主席穆勒
  • 南阳市委原书记朱是西被“双开”:搞劳民伤财的“政绩工程”
  • 阿曼外交大臣:伊美下一轮谈判暂定5月3日举行
  • 首映|马丽:真想抱抱臧姑娘,对她说辛苦了
  • 特朗普承认“24小时结束俄乌冲突”是玩笑:大家都知道
  • 上海论坛2025年会聚焦创新的时代,9份复旦智库报告亮相