详解Redis之事务

ops/2025/2/4 10:27:58/

目录

Redis事务

概念

特性

常用命令

MULTI

EXEC

DISCARD

WATCH

UNWATCH

使用演示

使用场景

注意事项


Redis事务

概念

Redis事务和MySQL的事务在概念上是类似的,都是把一系列操作绑定成一组,让这一组能够批量执行。但是,Redis事务和MySQL事务在特性上有所不同,Redis事务没有回滚机制,只能保证这些操作批量执行,不能做到“一个失败就恢复到初始状态”。

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

特性

1.弱化的原子性:
Redis事务中的所有命令都会序列化、按顺序地执行,执行过程中不会被其他客户端的命令请求打断。
但是,Redis事务没有回滚机制。如果事务中的某个命令执行失败,其他命令仍然会继续执行,事务不会因为一个命令的失败而回滚到初始状态。
2.不保证一致性:
由于Redis事务没有回滚机制,且没有涉及“约束”,因此事务执行过程中如果某个修改操作出现失败,就可能引起不一致的情况。
3.不需要隔离性:
Redis是单线程处理请求的,因此不需要隔离级别,也不会并发执行事务。
4.不需要持久性:
Redis事务是保存在内存中的,是否开启持久化是redis-server自己的事情,和事务无关。

常用命令
MULTI

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

EXEC

功能:真正执行事务。
每次添加一个操作,都会提示“QUEUED”,说明命令已经进入服务端的队列。当执行EXEC命令时,服务器才会真正执行这些命令。
EXEC命令的回复是一个数组,数组中的每个元素都是执行事务中的命令所产生的回复。回复元素的先后顺序和命令发送的先后顺序一致。

DISCARD

功能:放弃当前事务。
直接清空事务队列,之前的操作都不会真正执行。

WATCH

一定要在开启事务之前使用!!!

功能:监控一个或多个键。
当开启事务时,如果对WATCH的键进行修改(在EXEC命令执行之前),就会记录当前键的“版本号”。在真正提交事务时(执行EXEC命令时),如果发现当前服务器上的键的版本号已经超过了事务开始时的版本号,就会让事务执行失败。
WATCH命令本质上是给EXEC加了个判定条件,属于“乐观锁”。

UNWATCH

功能:取消对键的监控。
相当于WATCH的逆操作。

使用演示

没开启事务,一方修改,另一方能实时看到

开启事务,一方修改,另一方看不到,直到事务执行完毕 

开启事务,一方修改,另一方针对同一Key修改,最终value为执行事务设置的value 

WATCH只能在开启事务前使用 

使用WATCH,开启事务,在事务中修改Key之前,Key被修改,在事务中修改Key,当执行EXEC会提示(nil),Key的value依旧是另一方设置的value

使用场景

Redis事务适用于需要把多个操作打包进行的情况。例如,在商品抢购场景中,如果使用Redis事务,可以避免多线程下的线程安全问题。通过Redis事务,可以确保一系列操作(如检查库存、扣减库存等)的原子性执行,从而避免数据不一致的问题。

注意事项

1.锁的释放:
在使用WATCH命令进行乐观锁控制时,需要注意在事务执行完毕后及时释放锁(即取消对键的监控)。如果忘记释放锁或因为异常导致锁无法释放,则可能会导致死锁问题。
2.事务的失败处理:
由于Redis事务没有回滚机制,因此需要在设计业务逻辑时考虑到事务失败的处理方式。例如,可以通过检查命令的返回值来判断命令是否执行成功,并采取相应的处理措施。
3.避免事务过大:
如果事务过大(包含过多的命令),可能会导致Redis服务器的性能下降。因此,需要合理控制事务的大小,避免将过多的命令放入一个事务中执行。


http://www.ppmy.cn/ops/155543.html

相关文章

CSS(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…

python 使用Whisper模型进行语音翻译

目录 一、Whisper 是什么? 二、Whisper 的基本命令行用法 三、代码实践 四、是否保留Token标记 五、翻译长度问题 六、性能分析 一、Whisper 是什么? Whisper 是由 OpenAI 开源的一个自动语音识别(Automatic Speech Recognition, ASR)系统。它的主要特点是: 多语言…

用HTML、CSS和JavaScript实现庆祝2025蛇年大吉(附源码)

用HTML、CSS和JavaScript庆祝2025蛇年大吉 在这个数字化时代,网页设计不仅仅是为了展示信息,更是传达情感和文化的一种方式。2025年将是蛇年,许多人希望通过各种方式庆祝这一重要的时刻。在这篇文章中,我们将一起学习如何使用HTM…

Bili23-Downloader 新春版,支持自动高音画质

视频下载器 链接:迅雷云盘 Bili23-Downloader是一款免费开源简洁清爽易用的B视频下载工具,整体基于python开发。其可支持下载UP主上传的单集和多集视频,包括相关封面、弹幕、字幕和音频流等刮削。另支持二维码、账号信息登录。 前阵子同类…

基于 AWS SageMaker 对 DeepSeek-R1-Distilled-Llama-8B 模型的精调与实践

在当今人工智能蓬勃发展的时代,语言模型的性能优化和定制化成为研究与应用的关键方向。本文聚焦于 AWS SageMaker 平台上对 DeepSeek-R1-Distilled-Llama-8B 模型的精调实践,详细探讨这一过程中的技术细节、操作步骤以及实践价值。 一、实验背景与目标 …

3.Spring-事务

一、隔离级别: 脏读: 一个事务访问到另外一个事务未提交的数据。 不可重复读: 事务内多次查询相同条件返回的结果不同。 幻读: 一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。 二…

Redis篇 Redis如何清理过期的key以及对应的解决方法

Redis设置Key过期时间 在 Redis 中,可以通过特定的命令为 Key 设置过期时间,使得 Key 在一定时间后自动删除,这对于管理缓存、验证码等临时数据非常有用。 解决方法 1. Redis过期删除策略 1.1 如何实现过期策略 对一个 key 设置了过期时间…

wx044基于springboot+vue+uniapp的智慧物业平台小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…