【Redis】Redis事务

server/2024/12/22 10:01:21/

1. 什么是事务?

Redis 的事务和 MySQL的事务概念上是类似的,都是把一系列操作绑定成一组.让这一组能够批量执行.但是注意体会 Redis 的事务和 MySQL 事务的区别:

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

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

整体来说,Redis的事务的功能相对于MySQL来说是弱很多的,只能够保证事务中的这几个操作时“连续的”,不会被其他的客户端加塞,仅此而已。

2. 事务操作

  • MULTI:标记事务的开始,成功开启事务后,返回OK。
  • EXEC:执行事务中的所有命令。
  • DISCARD:取消事务,放弃事务中的所有命令。
  • WATCH:监视一个或多个键,如果在执行事务之前这些键被其他命令修改,则事务会被取消。

2.1 MULTI、EXEC、DISCARD

开启一个事务,执行成功返回OK。开启事务后redis命令就会被放到FIFO队列中,接收到EXEC命令后就会打包执行队列中的命令。

EXEC就是真正的去执行事务,执行队列中的命令。

每次添加一个操作,都会提示"QUEUED",说明命令已经进入客户端的队列了真正执行 EXEC 的时候,客户端才会真正把上述操作发送给服务器.此时就可以获取到上述 key 的值了.

在这里插入图片描述
DISCARD 就是放弃当前事务,此时就会讲队列中的事务清空,之前的所有操作都不会真正被执行。
在这里插入图片描述

2.2 WATCH

如果我们在执行事务的过程中,某个事物中修改的值,又被其他的客户端修改了,此时就会容易出现数据不一致问题。。
WATCH命令就能够监控key,在上面的场景中,通过WATCH可以看key在事务的MULTI和EXEC之间,set key之后,是否被外部其他的客户端修改。

watch 命令就是用来解决这个问题的.watch 在该客户端上监控一组具体的 key.

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

与之对应的还有UNWATCH,取消对 key 的监控.相当于 WATCH 的逆操作.


http://www.ppmy.cn/server/129213.html

相关文章

深度学习(7):RNN实战之人名的国籍预测

文章目录 数据集NameDataSetOne-Hot 编码是什么思路实现代码带来的问题 Embedding模型过程分析1.超参数设置2.数据集处理3. 数据 to Tensor4.训练 完整代码NameDateSetsimpleRNN 数据集 格式为(country_name).txt的文本文件包含该国家的常见姓名, 所以数据x是文本里…

Leetcode—152. 乘积最大子数组【中等】

2024每日刷题&#xff08;174&#xff09; Leetcode—152. 乘积最大子数组 C实现代码 class Solution { public:int maxProduct(vector<int>& nums) {int n nums.size();int mx nums[0];int mn nums[0];int ans mx;for(int i 1; i < n; i) {const int prem…

powerbi之常用DAX函数使用介绍——提供数据源练习

前述&#xff1a; 本次使用数据是包含产品表、客户表、区域表、销售订单表的一份销售订单数据&#xff0c;数据源链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1micl_09hFrgz2aUBERkeZg 提取码&#xff1a;y17e 一、CALCULATE 1.语法结构 语法结构CALCUL…

Python爬虫之正则表达式于xpath的使用教学及案例

正则表达式 常用的匹配模式 \d # 匹配任意一个数字 \D # 匹配任意一个非数字 \w # 匹配任意一个单词字符&#xff08;数字、字母、下划线&#xff09; \W # 匹配任意一个非单词字符 . # 匹配任意一个字符&#xff08;除了换行符&#xff09; [a-z] # 匹配任意一个小写字母 […

HarmonyOS应用六之应用程序进阶二

目录&#xff1a; 一、进度条通知二、闹钟提醒2.1、在module.json5配置文件中开启权限2.2、导入后台代理提醒reminderAgentManager模块&#xff0c;将此模块命名为reminderAgentManager2.3、如果是新增提醒&#xff0c;实现步骤如下&#xff1a; 3、Native C交互4、第三方库的基…

低代码平台的缩写和使用方法是什么?蓝燕云低代码平台开发经验!

随着企业数字化转型的加速&#xff0c;低代码平台越来越受到欢迎。低代码平台可以极大地简化开发过程&#xff0c;使得非专业开发者也能够快速创建应用程序。然而&#xff0c;对于低代码平台&#xff0c;很多人还存在一些疑惑&#xff0c;尤其是在其缩写和具体使用方法方面。本…

单片机(学习)2024.10.8

ok家人们&#xff0c;国庆回来继续开始新的单片机的学习&#xff0c;这次学习的单片机芯片为STM32U575RIT6 计算机基础 IO逻辑 计算机系统中的高低电平逻辑1和0&#xff0c;数据在计算机中的存储、传输、运算都是以二进制形式进行的。数据的传输通过总线真正传递的是电信号&a…

力扣10.8

174. 地下城游戏 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数…