redis事务管理详解
事务管理
- 事务管理
- 乐观锁与悲观锁
- watch命令实现乐观锁
- watch命令示例
事务管理
Redis 提供了事务管理功能,可以通过 Redis 的 MULTI、EXEC、WATCH 和 DISCARD 命令来实现。
-
开启事务:
使用 MULTI 命令开始一个事务,表示接下来执行的命令都属于该事务。示例:
MULTI -
执行事务操作:
在事务中可以执行多个命令,这些命令不会立即执行,而是被放入一个队列中。示例:
SET key1 value1 GET key1 INCR key2 -
提交事务:
使用 EXEC 命令提交事务,Redis 会按照命令的顺序执行队列中的所有命令。示例:
EXEC执行 EXEC 命令后,Redis 会执行对应的事务命令,并返回每个命令的执行结果。
-
监视键变化:
可以使用 WATCH 命令监视一个或多个键的变化。如果在事务执行期间,被监视的键发生了修改,事务将被中止。示例:
WATCH key1 key2 -
取消事务:
如果在执行事务前需要取消当前事务,可以使用 DISCARD 命令。示例:
DISCARD
事务的特性:
- Redis 事务是一单个隔离的操作序列,从开始到提交期间,Redis 不会中断该序列,也不会处理其他客户端的请求。
- 在 EXEC 命令前,事务中的命令都只是进入队列,并没有实际执行,所以即使其中某个命令出错,也不会影响其他命令的执行。
- Redis 并不提供回滚机制,一旦事务提交,其中的命令就会全部执行,无法撤销。
- 如果在 WATCH 监视的键被修改后,EXEC 命令执行前,事务会被放弃执行。
需要注意的是,Redis 的事务并不具备像关系型数据库那样的 ACID 特性。它主要用于将多个命令打包在一起,确保这些命令的原子性执行,但事务间没有隔离性和持久性的特性。
乐观锁与悲观锁
Redis中的乐观锁和悲观锁是用于处理并发访问时保证数据一致性的两种不同策略。
-
乐观锁:
- 实现方式:乐观锁是基于数据版本号或者时间戳来实现的。在读取数据之前,会获取该数据的版本号或时间戳,然后在更新数据时比对版本号或时间戳,如果匹配则更新成功,否则表示其他客户端已经修改了数据。
- 实际操作:在Redis中,
使用WATCH命令监视指定的键之后使用MULTI/EXEC组合多个命令进行操作,如果在执行期间监视的键被其他客户端修改过,则事务将中止执行。 - 应用场景:适用于读操作较多、写冲突较少的场景。
-
悲观锁:
- 实现方式:悲观锁是基于锁机制实现的,即在访问数据之前,就直接加锁,确保在当前事务完成之前其他事务无法访问相同的数据。
- 实际操作:在Redis中,可以使用SET命令
设置带有NX(不存在则创建)参数的锁键,如果设置成功则表示获得锁,操作完成后再释放锁。 - 应用场景:适用于写操作较多、写冲突较多的场景。
需要根据具体情况选择合适的锁策略。乐观锁在遇到并发冲突时不会阻塞等待,而是通过检测来解决并发问题;悲观锁则会直接加锁,可能会导致其他事务等待,但可以确保数据的一致性。
watch命令实现乐观锁
Redis中的WATCH命令用于实现乐观锁。它可以监视一个或多个键,并在执行事务期间检查这些键是否被修改,如果被修改则中止事务的执行。
使用WATCH命令的步骤如下:
- 使用MULTI命令开启事务。
- 使用WATCH命令监视需要检查的键。
- 执行一系列的读操作,获取需要修改的数据。
- 如果
其他客户端修改了被监视的键,则事务将中止执行。 - 如果键未被修改,继续执行事务中的其他命令。
- 使用EXEC命令提交事务。
示例代码如下:
WATCH key1 key2 ...
MULTI
// 在事务中执行读取、修改等操作
EXEC
当执行EXEC命令时,Redis会检查被WATCH命令监视的键是否被其他客户端修改过,如果有修改,则事务将中止执行,返回空结果。否则,事务将按照顺序执行其中的命令。
WATCH命令可以通过在客户端代码中嵌入实现乐观锁的逻辑,以确保在并发环境下对数据的修改是同步和一致的。
watch命令示例
示例:当使用Redis的WATCH命令进行乐观锁处理时,可以通过两个事务来说明其工作原理。
假设有两个客户端同时对同一个键进行操作,其中一个客户端执行了事务A,另一个客户端执行了事务B。
事务A的代码示例:
WATCH key
MULTI
SET key "New Value"
EXEC
事务B的代码示例:
WATCH key
MULTI
SET key "Another Value"
EXEC
两个事务的执行都失败
下面是执行过程的解释:
- 初始状态:假设"key"的值为"Initial Value"。
- 事务A开始执行:
- 使用WATCH命令监视"key"。
- 执行事务A中的命令。
- 尝试将"key"的值设置为"New Value"。
- 如果在执行期间没有其他客户端修改了"key",则提交事务A,“key"的值更新为"New Value”。
- 如果在执行期间有其他客户端修改了"key",则事务A被中止,不会修改"key"的值。
- 事务B开始执行:
- 使用WATCH命令监视"key"。
- 执行事务B中的命令。
- 尝试将"key"的值设置为"Another Value"。
- 如果在执行期间没有其他客户端修改了"key",则提交事务B,“key"的值更新为"Another Value”。
- 如果在执行期间有其他客户端修改了"key",则事务B被中止,不会修改"key"的值。
通过使用WATCH命令,事务A和事务B在执行期间都会监视"key"的变化情况。如果有其他客户端对"key"进行修改,则当前事务将被中止,从而保证数据的一致性和并发操作的正确性。
相关文章:
redis事务管理详解
事务管理 事务管理乐观锁与悲观锁watch命令实现乐观锁watch命令示例 事务管理 Redis 提供了事务管理功能,可以通过 Redis 的 MULTI、EXEC、WATCH 和 DISCARD 命令来实现。 开启事务: 使用 MULTI 命令开始一个事务,表示接下来执行的命令都属于…...
国产低功耗蓝牙HS6621CxC/6621Px系列支持Find My网络功能方案芯片
目录 什么是“Find My“?HS6621系列简介 什么是“Find My“? “Find My”是苹果公司于19年前推出的针对失物追踪,Find My iPhone(查找我的iPhone)和Find My Friends(查找朋友)的结合体应用。为…...
【openGauss】分区表的介绍与使用
一、openGauss分区表介绍 在openGauss中,数据分区是在一个节点内部对数据按照用户指定的策略做进一步的水平分表,将表中的数据按照指定方式划分为多个互不重叠的部分。 对于大多数用户使用场景,分区表和普通表相比具有以下优点: …...
代码随想录算法训练营day57
文章目录 Day57回文子串题目思路代码 最长回文子序列题目思路代码 Day57 回文子串 647. 回文子串 - 力扣(LeetCode) 题目 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。…...
【基础类】—前后端通信类系统性学习
一、什么是同源策略及限制 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。源:协议、域名和端口, 默认端口是80 三者有一个不同,即源不同,就是跨域 ht…...
vite项目中使用@代表根路径
1.配置vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pathexport default defineConfig({plugins: [vue()],resolve: {alias:{: path.resolve(__dirname, src) }} })2.报错path和__dirname 找不到模块“path”或其相…...
冶金化工操作VR虚拟仿真实验软件提高员工们协同作业的配合度
对于高风险行业来说,开展安全教育培训是企业的重点工作,传统培训逐渐跟不上时代变化和工人需求,冶金安全VR模拟仿真培训系统作为一种新型的教育和培训工具,借助VR虚拟现实技术为冶金行业的工人提供一个安全、高效的培训环境。 冶金…...
SQL Server数据库 -- 索引与视图
文章目录 一、索引 聚集索引非聚集索引二、视图三、自定义函数 标量函数表值函数四、游标五、总结 前言 在学习完创建库表、查询等知识点后,为了更加方便优化数据库的存储和内容,我们需要学习一系列的方法例如索引与视图等等,从而使我们更加…...
2023 java web面试秘籍
目录 第一章:Java Web基础知识1.介绍3.Java Web基本概念 4.常见面试问题第二章:Java Web核心概念和技术1.介绍3.Servlet和JSP4.Web安全5.常见面试问题 第三章:Java Web高级概念和技术1.介绍3.Spring框架4.安全性5.常见面试问题 第四章&#x…...
2023-08-05力扣今日二题
链接: 剑指 Offer 18. 删除链表的节点 题意: 如题 解: 基础链表操作 实际代码: #include<iostream> using namespace std; struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {} }; Li…...
stl_list类(使用+实现)(C++)
list 一、list-简单介绍二、list的常用接口1.常见构造2.iterator的使用3.Capacity和Element access4.Modifiers5.list的迭代器失效 三、list实现四、vector 和 list 对比五、迭代器1.迭代器的实现2.迭代器的分类(按照功能分类)3.反向迭代器(1)、包装逻辑…...
利用hfish反控境外攻击源主机
导师给了7个网络安全课题选题,本想和他聊了下思路,他一挥手让我先做出点东西再来聊就把我打发走了…… 正好前段时间阿里云到校做推广,用优惠卷薅了一台云服务器,装了hfish先看下情况 没想到才装上没两天数据库就爆了࿰…...
4、Rocketmq之存储原理
CommitLog ~ MappedFileQueue ~ MappedFile集合...
在线原型设计工具有好用的吗?就是这10个
随着设计工作的不断发展,原型设计在设计工作中越来越重要,而在线原型设计工具在减轻了设计师工作负担的同时也提高了设计师的工作效率,今天本文将为大家推荐10个能在线使用的原型设计工具,一起来看看吧! 1、即时设计 …...
Vc - Qt - QPainter translate
QPainter的translate()函数是用来对绘制坐标系统进行平移操作的方法。它可以将绘制的原点(坐标轴的起始点)在水平和垂直方向上进行平移。以下是一个使用QPainter的translate()方法进行坐标平移的示例代码: QPainter painter(this);// 绘制一个…...
Spark Catalog详解
前言 旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行批量删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗? 我:你应该静下心来好好把spark基础知识进行全面学习。 实习生:难道spark有这功能,而我没有学习过?咋弄啊? 我:…...
【Spring专题】手写简易Spring容器过程分析
前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程,所以,本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…...
fastadmin自定义键值组件Fieldlist
需求场景: 后台设置前端的固定话费充值金额。编辑时要求能够增删改,给到前端的数据,是要根据金额正序排列,用fastadmin的键值组件(Fieldlist),使用Art-Template模板语法自定义模板。 最终效果如下图所示: …...
yolov2检测网数据集标注_labelme使用_json2txt格式转换
yolov2检测网数据集标注_labelme使用_json2txt格式转换 一、安装Anaconda二、创建labelme虚拟环境三、使用labelme标注健康非健康猫狗数据3.1 打开数据集所在文件夹3.2 进行标注数据集3.3 json2txt3.4 按文件目录和训练测试数据集重分配 四、数据喂给服务器网络参考链接 一、安…...
C/C++面试总结
一、关键字static、const、extern、volatile作用 1、const 1.修饰常量 用const修饰的变量是不可变的,修饰后的变量只能使用,不能修改。 2.修饰指针 如果const位于*的左侧,eg:const int* a,则const就是用来修饰指针…...
用MATLAB搞定模电实验:单管共射放大电路静态工作点与放大倍数的保姆级仿真
MATLAB仿真单管共射放大电路:从理论到实践的完整指南 引言 在电子工程领域,单管共射放大电路是模拟电路设计的基石之一。传统实验教学中,学生往往需要花费大量时间搭建实体电路、调整参数并测量数据,这不仅效率低下,…...
深度解析jqktrader:基于Python的同花顺自动化交易架构设计与实战应用
深度解析jqktrader:基于Python的同花顺自动化交易架构设计与实战应用 【免费下载链接】jqktrader 同花顺自动程序化交易 项目地址: https://gitcode.com/gh_mirrors/jq/jqktrader 在量化交易技术快速发展的今天,传统手动交易已无法满足高频、精准…...
K8s混沌工程叛变:随机宕机暴露的职场PUA
在云原生架构席卷软件世界的今天,Kubernetes(K8s)以其强大的编排能力,成为分布式系统稳定运行的基石。随之兴起的混沌工程,则扮演着“压力测试师”的角色,通过主动注入Pod宕机、网络延迟等故障,…...
算法调试与错误处理终极指南:5个实用技巧确保C++算法正确性
算法调试与错误处理终极指南:5个实用技巧确保C算法正确性 【免费下载链接】algorithms Algorithms & Data structures in C. 项目地址: https://gitcode.com/gh_mirrors/algo/algorithms GitHub 加速计划 / algo / algorithms 项目提供了丰富的 C 算法与…...
为什么说降AI率不等于降质量从算法角度看本质
“用了工具处理,论文会不会变差?” 这是使用降AI率工具前很多同学最担心的问题。这篇文章从算法逻辑出发,把这个问题说清楚。 简短结论:好的降AI工具不会降低论文质量;差的工具会。判断哪个是好工具,这篇…...
五大赛道齐亮相!第四届世界科学智能大赛启动报名,首设人文科学赛道
随着人工智能深入科研实践,它不仅在各领域课题的预测、计算等方面屡创新高,也正介入曾被认为高度依赖人类直觉与经验的文化阐释工作。继第四届世界科学智能大赛的创新赛道“AI4S智能体CNS挑战赛”在一个月前率先发布,吹响了自主科研智能体的攻…...
基于C++实现时间片与高优先级抢占调度算法的进程与资源管理功能模拟操作系统OS
MockProcessCmd [Experiment]设计和实现基于时间片与高优先级抢占调度算法的进程与资源管理功能模拟 OS Computer operating system experiment. 开发环境 IDE:Visual Studio 2019Language:C STL 功能需求 设计和实现进程与资源管理,并…...
ArcGIS Pro用户必看:解决CAD转SHP后坐标系丢失的完整配置流程(附Python脚本)
ArcGIS Pro用户必看:解决CAD转SHP后坐标系丢失的完整配置流程(附Python脚本) 当你从CAD图纸转换到SHP格式时,最令人头疼的问题莫过于坐标系信息的丢失。想象一下,你精心准备的规划图纸在GIS软件中变成了一堆无法定位的…...
MAP vs MLE:机器学习参数估计该怎么选?5个真实案例告诉你答案
MAP vs MLE:机器学习参数估计该怎么选?5个真实案例告诉你答案 在机器学习项目的参数估计环节,数据科学家常常面临一个关键选择:采用最大后验概率(MAP)还是最大似然估计(MLE)…...
MySQL服务从CentOS7迁移到Rocky Linux 9.4实施文档
一、文档概述 本文档针对CentOS 7系统上运行的MySQL服务迁移至Rocky Linux 9.4的完整实施流程进行说明,适用于生产环境下MySQL 5.7/8.0版本的迁移操作,涵盖迁移前准备、迁移执行、验证、回滚全流程,可有效控制迁移风险,保障业务连续性。 本次迁移可选两种方案:原地升级迁…...
