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

redis事务管理详解

事务管理

      • 事务管理
      • 乐观锁与悲观锁
      • watch命令实现乐观锁
      • watch命令示例

事务管理

Redis 提供了事务管理功能,可以通过 Redis 的 MULTI、EXEC、WATCH 和 DISCARD 命令来实现。

  1. 开启事务:
    使用 MULTI 命令开始一个事务,表示接下来执行的命令都属于该事务。

    示例:

    MULTI
    
  2. 执行事务操作:
    在事务中可以执行多个命令,这些命令不会立即执行,而是被放入一个队列中。

    示例:

    SET key1 value1
    GET key1
    INCR key2
    
  3. 提交事务:
    使用 EXEC 命令提交事务,Redis 会按照命令的顺序执行队列中的所有命令。

    示例:

    EXEC
    

    执行 EXEC 命令后,Redis 会执行对应的事务命令,并返回每个命令的执行结果。

  4. 监视键变化:
    可以使用 WATCH 命令监视一个或多个键的变化。如果在事务执行期间,被监视的键发生了修改,事务将被中止。

    示例:

    WATCH key1 key2
    
  5. 取消事务:
    如果在执行事务前需要取消当前事务,可以使用 DISCARD 命令。

    示例:

    DISCARD
    

事务的特性:

  • Redis 事务是一单个隔离的操作序列,从开始到提交期间,Redis 不会中断该序列,也不会处理其他客户端的请求。
  • 在 EXEC 命令前,事务中的命令都只是进入队列,并没有实际执行,所以即使其中某个命令出错,也不会影响其他命令的执行。
  • Redis 并不提供回滚机制,一旦事务提交,其中的命令就会全部执行,无法撤销。
  • 如果在 WATCH 监视的键被修改后,EXEC 命令执行前,事务会被放弃执行。

需要注意的是,Redis 的事务并不具备像关系型数据库那样的 ACID 特性。它主要用于将多个命令打包在一起,确保这些命令的原子性执行,但事务间没有隔离性和持久性的特性。

乐观锁与悲观锁

Redis中的乐观锁和悲观锁是用于处理并发访问时保证数据一致性的两种不同策略。

  1. 乐观锁:

    • 实现方式:乐观锁是基于数据版本号或者时间戳来实现的。在读取数据之前,会获取该数据的版本号或时间戳,然后在更新数据时比对版本号或时间戳,如果匹配则更新成功,否则表示其他客户端已经修改了数据。
    • 实际操作:在Redis中,使用WATCH命令监视指定的键之后使用MULTI/EXEC组合多个命令进行操作,如果在执行期间监视的键被其他客户端修改过,则事务将中止执行。
    • 应用场景:适用于读操作较多、写冲突较少的场景。
  2. 悲观锁:

    • 实现方式:悲观锁是基于锁机制实现的,即在访问数据之前,就直接加锁,确保在当前事务完成之前其他事务无法访问相同的数据。
    • 实际操作:在Redis中,可以使用SET命令设置带有NX(不存在则创建)参数的锁键,如果设置成功则表示获得锁,操作完成后再释放锁。
    • 应用场景:适用于写操作较多、写冲突较多的场景。

需要根据具体情况选择合适的锁策略。乐观锁在遇到并发冲突时不会阻塞等待,而是通过检测来解决并发问题;悲观锁则会直接加锁,可能会导致其他事务等待,但可以确保数据的一致性。

watch命令实现乐观锁

Redis中的WATCH命令用于实现乐观锁。它可以监视一个或多个键,并在执行事务期间检查这些键是否被修改,如果被修改则中止事务的执行。

使用WATCH命令的步骤如下:

  1. 使用MULTI命令开启事务。
  2. 使用WATCH命令监视需要检查的键。
  3. 执行一系列的读操作,获取需要修改的数据。
  4. 如果其他客户端修改了被监视的键,则事务将中止执行。
  5. 如果键未被修改,继续执行事务中的其他命令。
  6. 使用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

两个事务的执行都失败

下面是执行过程的解释:

  1. 初始状态:假设"key"的值为"Initial Value"。
  2. 事务A开始执行:
    • 使用WATCH命令监视"key"。
    • 执行事务A中的命令。
    • 尝试将"key"的值设置为"New Value"。
    • 如果在执行期间没有其他客户端修改了"key",则提交事务A,“key"的值更新为"New Value”。
    • 如果在执行期间有其他客户端修改了"key",则事务A被中止,不会修改"key"的值。
  3. 事务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力扣今日二题

链接&#xff1a; 剑指 Offer 18. 删除链表的节点 题意&#xff1a; 如题 解&#xff1a; 基础链表操作 实际代码&#xff1a; #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.迭代器的分类&#xff08;按照功能分类&#xff09;3.反向迭代器(1)、包装逻辑…...

利用hfish反控境外攻击源主机

导师给了7个网络安全课题选题&#xff0c;本想和他聊了下思路&#xff0c;他一挥手让我先做出点东西再来聊就把我打发走了…… 正好前段时间阿里云到校做推广&#xff0c;用优惠卷薅了一台云服务器&#xff0c;装了hfish先看下情况 没想到才装上没两天数据库就爆了&#xff0…...

4、Rocketmq之存储原理

CommitLog ~ MappedFileQueue ~ MappedFile集合...

在线原型设计工具有好用的吗?就是这10个

随着设计工作的不断发展&#xff0c;原型设计在设计工作中越来越重要&#xff0c;而在线原型设计工具在减轻了设计师工作负担的同时也提高了设计师的工作效率&#xff0c;今天本文将为大家推荐10个能在线使用的原型设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 …...

Vc - Qt - QPainter translate

QPainter的translate()函数是用来对绘制坐标系统进行平移操作的方法。它可以将绘制的原点&#xff08;坐标轴的起始点&#xff09;在水平和垂直方向上进行平移。以下是一个使用QPainter的translate()方法进行坐标平移的示例代码&#xff1a; QPainter painter(this);// 绘制一个…...

Spark Catalog详解

前言 旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行批量删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗? 我:你应该静下心来好好把spark基础知识进行全面学习。 实习生:难道spark有这功能,而我没有学习过?咋弄啊? 我:…...

【Spring专题】手写简易Spring容器过程分析

前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程&#xff0c;所以&#xff0c;本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…...

fastadmin自定义键值组件Fieldlist

需求场景&#xff1a; 后台设置前端的固定话费充值金额。编辑时要求能够增删改&#xff0c;给到前端的数据&#xff0c;是要根据金额正序排列&#xff0c;用fastadmin的键值组件(Fieldlist)&#xff0c;使用Art-Template模板语法自定义模板。 最终效果如下图所示&#xff1a; …...

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修饰的变量是不可变的&#xff0c;修饰后的变量只能使用&#xff0c;不能修改。 2.修饰指针 如果const位于*的左侧&#xff0c;eg&#xff1a;const int* a&#xff0c;则const就是用来修饰指针…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...