redis--事务

redis事务

在Redis中,事务是一组原子性操作的集合,它们被一起执行,要么全部执行成功,要么全部回滚。虽然Redis的事务并不遵循传统数据库的ACID特性,但它仍然提供了一种将多个命令打包成一组执行的机制,适用于需要保持一系列操作的一致性的场景。

常见命令

命令描述
MULTI开启一个事务,标记事务块的开始
EXEC执行事务中的所有命令,并将结果返回
DISCARD取消当前事务,放弃事务中的所有命令
WATCH监视一个或多个键,如果在事务执行前键被修改,事务将被中断
UNWATCH取消对所有键的监视
QUEUED在事务块中的每个命令执行后返回的标识

事务流程

开始事务:使用MULTI命令标记一个事务块的开始。
命令入队:在MULTI之后,所有的命令都不会立即执行,而是被放入一个队列中,每个命令都会返回一个QUEUED的响应。
执行事务:使用EXEC命令触发事务,一并执行事务中的所有命令,并返回一个数组作为结果。如果事务中有语法错误或者类型错误的命令,那么EXEC会返回一个错误,并且不执行任何命令。如果事务中有运行时错误的命令,那么EXEC会跳过这些错误命令,继续执行其他正常的命令。

事务冲突

在Redis中,事务冲突通常指的是在执行事务过程中,多个客户端对相同的键进行修改,从而引发数据不一致的情况。这种情况可能导致事务的结果与预期不符,因为不同客户端可能会在事务中同时修改相同的数据,而事务并不具备真正的隔离性和锁机制,所以可能导致数据冲突。

举个例子,假设有两个客户端在并发地进行购买商品的操作,每个客户端都会从库存中减少相应数量的商品。如果两个客户端同时在事务中减少库存,那么可能会出现如下冲突:

  1. 客户端A读取库存为10,开始执行事务。
  2. 客户端B同时读取库存也为10,开始执行事务。
  3. 客户端A将库存减少3,变成7。
  4. 客户端B将库存减少2,变成8。

在这种情况下,两个客户端的事务冲突,导致库存的最终结果不是预期的。这就是事务冲突引发的问题,可能导致数据不一致性。

为了避免事务冲突,Redis提供了WATCH命令,可以在事务执行前监视一个或多个键,如果在事务执行前有其他客户端对这些键进行了修改,事务会被中断,这样可以减少事务冲突的可能性。但是需要注意,WATCH并不能完全解决事务冲突问题,因为仍然可能在EXEC执行时发生冲突。

乐观锁和悲观锁

乐观锁

乐观锁是一种较为轻量级的并发控制机制,它假定在大多数情况下,事务之间不会发生冲突。在 Redis 中,乐观锁通常通过使用版本号或时间戳来实现。当一个客户端想要修改一个键的值时,它会先获取当前键的版本号或时间戳,然后在修改完成后再次检查版本号或时间戳是否仍然一致。如果一致,说明期间没有其他客户端修改过该键的值,操作可以被提交。如果不一致,说明期间有其他客户端修改了该键的值,操作可能会失败或需要重试。

优点:

  • 适用于多读少写的场景,因为大部分时间数据冲突较少。
  • 不需要长时间的锁定,提高了系统的并发性能。

缺点:

  • 当冲突发生时,需要重试操作,可能会增加系统开销。
  • 无法解决高并发下的复杂冲突。

悲观锁

悲观锁是一种相对较重的并发控制机制,它假定事务之间可能会发生冲突,因此在访问数据之前会对数据进行锁定,以防止其他事务对其进行修改。在 Redis 中,悲观锁通常使用 WATCH 命令来实现,它可以监视一个或多个键,如果在事务执行期间这些键的值发生了变化,事务将被回滚。

优点:

  • 可以确保数据的一致性,适用于复杂的事务场景。
  • 避免了操作冲突,无需重试。

缺点:

  • 长时间的锁定可能降低系统的并发性能。
  • 需要耗费更多的系统资源。

乐观锁和悲观锁的对比:

  1. 性能开销: 乐观锁的性能开销较低,因为它不会长时间地锁定数据,而是在操作时检查冲突。悲观锁在锁定数据的同时,会对系统的并发性能产生一定的影响。

  2. 适用场景: 乐观锁适用于多读少写的场景,因为它假定冲突较少。悲观锁适用于复杂的事务场景,需要确保数据的一致性。

  3. 冲突处理: 乐观锁在发生冲突时需要进行重试操作,而悲观锁可以避免操作冲突,但可能会造成长时间的等待。

  4. 并发性能: 乐观锁可以提高系统的并发性能,因为它不会长时间锁定数据。悲观锁可能会降低系统的并发性能,因为它需要长

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

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

相关文章

Unity启动项目无反应的解决

文章首发见博客:https://mwhls.top/4803.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议,私信不回。 摘要:通过退还并重新载入许可证以解决Unity项目启动无反应问题。 场景 Unity Hub启动项目…

ZLMediakit-method ANNOUNCE failed: 401 Unauthorized

使用ffmpeg推流: nohup ffmpeg -stream_loop -1 -re -i "/usr/local/mp4/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://10.55.134.12/live/test &[rootlocalhost ~]# ffmpeg -stream_loop -1 -re -i "/usr/local/mp…

人脸老化预测(Python)

本次项目的文件 main.py主程序如下 导入必要的库和模块: 导入 TensorFlow 库以及自定义的 FaceAging 模块。导入操作系统库和参数解析库。 定义 str2bool 函数: 自定义函数用于将字符串转换为布尔值。 创建命令行参数解析器: 使用 argparse.A…

视觉学习(八)---zed调用yolov5之目标检测遇到的问题及解决

1.前言 zed调用yolov5进行目标检测时遇到的问题,记录下~~ 2.环境信息 开发板:Jetson Xviewer NX 摄像头: zed2系统:Ubuntu18.043.问题及解决 问题1: RuntimeError: cuDNN error: CUDNN_STATUS_MAPPING_ERROR 原因&…

【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom )

目录 一、问题背景二、修改方法2.1 修改种子2.2 使用linux中的 /dev/urandom 生成随机数 三、/dev/random 和 /dev/urandom 的原理3.1 参考连接3.2 重难点总结3.2.1 生成随机数的原理3.2.2 随机数生成器的结构3.2.3 二者的区别和选择 四、在代码的使用方法 一、问题背景 在一个…

RabbitMq-2安装与配置

Rabbitmq的安装 1.上传资源 注意:rabbitmq的版本必须与erlang编译器的版本适配 2.安装依赖环境 //打开虚拟机 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz3.安装erlan…

理解docker命令

基础命令 帮助命令 docker --help(帮助命令) 用于获取某个命令的帮助信息 #命令帮助 docker 命令 --help 小技巧 换行符 \ 使用命令换符,可以让繁杂命令变得有条理 #命令换行,使用换行符 \ docker ... \... \ 镜像命令 d…

不含数字的webshell绕过

异或操作原理 1.首先我们得了解一下异或操作的原理 在php中,异或操作是两个二进制数相同时,异或(相同)为0,不同为1 举个例子 A的ASCII值是65,对应的二进制值是0100 0001 的ASCII值是96,对应的二进制值是 0110 000…

Android11 中 LED 使用-RK3568

文章目录 前言原理图设备树驱动前言 现在我们来学习点亮LED 原理图 然后对应在核心板原理图上查找 Working_LEDEN_H_GPIO0_B7,如下图所示: 那么我们只要控制 GPIO0_B7 即可控制 led 的亮灭。 设备树 leds: leds {compatible = "gpio-leds";work_led: work {gpi…

6-模板初步使用

官网: 中文版: 介绍-Jinja2中文文档 英文版: Template Designer Documentation — Jinja Documentation (2.11.x) 模板语法 1. 模板渲染 (1) app.py 准备数据 import jsonfrom flask import Flask,render_templateimport settingsapp Flask(__name__) app.config.from_obj…

flutter Android 打包和发布

环境 mac vscode 项目简易打包 打开VScode终端:输入命令flutter build apk即可 可能报错: w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath: 修改android/build.gradle 中版本信息 项…

上海亚商投顾盘:沪指震荡反弹 机器人概念股掀涨停潮

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日震荡反弹,科创50盘中涨超1%。机器人概念股掀涨停潮,通力科技、昊志机电、哈焊…

Java实现将内容写到文件里面

目录 1 实现 1 实现 String appendLog "";File logFile new File(logFileName);// append file contentFileOutputStream fos null;try {fos new FileOutputStream(logFile, true);fos.write(appendLog.getBytes("utf-8"));fos.flush();} catch (Ex…

CentOS ens160 显示disconnected

使用nmcli device查看网卡状态,显示如图: 检查宿主机系统VMware DHCP Sevice和VMware NAT Sevice服务是否正常运行。 右键点击我的电脑管理按钮,打开计算机管理点击服务

【SA8295P 源码分析】62 - Android GVM Kernel 内核 make bootimage 过程分析

【SA8295P 源码分析】62 - Android GVM Kernel 内核 make bootimage 过程分析 一、make bootimage 命令执行过程分析1.1 source buid/envsetup.sh 分析1.2 lunch msmnile_gvmq-userdebug 分析1.3 make bootimage:step 1 之 加载配置文件过程分析1.4 make bootimage:step 2 之…

C++入门篇9---list

list是带头双向循环链表 一、list的相关接口及其功能 1. 构造函数 函数声明功能说明list(size_type n,const value_type& valvalue_type())构造的list中包含n个值为val的元素list()构造空的listlist(const list& x)拷贝构造list(InputIterator first, InputIterator…

[FPGA IP系列] FPGA常用存储资源大全(RAM、ROM、CAM、SRAM、DRAM、FLASH)

本文主要介绍FPGA中常用的RAM、ROM、CAM、SRAM、DRAM、FLASH等资源。 一、RAM RAM(Random Access Memory)是FPGA中最基本和常用的内部存储块,根据不同架构可以实现不同容量,最大可达几十Mb。 FPGA中的RAM主要包括: 分布式RAM:存在于逻辑块…

【仿写tomcat】七、项目结构优化以及代码开源

仿写tomcat 项目结构开源地址 项目结构 到目前为止,博主的仿写tomcat就告一段落了,后续有时间了还会继续补充功能,现在的项目结构如下。 在保证功能的前提下作出的改动有: 将各个类中的参数统一成了Config类,通过对…

17----图表

本节我们来学习markdown的图表。 Markdown 本身并不支持图表,但 Markdown 在技术文章、文档、博客领域使用较多,所以非常多的 Markdown 解析器是支持图表扩展的。在支持图表扩展的 Markdown 解析器中,我们可以使用解析支持的图表语法来渲染图…