Redis篇-3--原理篇2--Redis事务

news2024/12/30 3:16:14

1、概述

Redis 提供了简单的事务机制,Redis 事务的本质是一组命令的集合。当执行redis事务时,即一次性按照添加顺序依次执行这些命令,中间不会被打断或者干扰。

Redis 的事务机制并不像关系型数据库中的事务那样提供完整的ACID特性(原子性、一致性、隔离性和持久性),但它确实提供了一种方式来确保一组命令作为一个整体被执行。

2、redis事务的命令

Redis 事务通过 MULTI、EXEC、WATCH 和 DISCARD 这四个命令来实现。

(1)、MULTI

MULTI 命令用于标记一个事务块的开始。一旦接收到 MULTI,Redis 会将之后接收到的所有命令放入队列中,而不是立即执行。这些命令会在稍后的 EXEC调用时一起执行。
语法: MULTI
使用示例:
在这里插入图片描述

(2)、EXEC

EXEC 命令用于执行之前由 MULT` 标记的所有命令。它会按照它们被加入队列的顺序执行所有命令,并一次性返回所有命令的结果。
如果在 MULTI 和 EXEC之间有 WATCH 监视的键被修改,则 EXEC将返回 null,表示事务失败。
语法: EXEC
使用示例:
在这里插入图片描述

(3)、WATCH

WATCH 命令用于实现乐观锁。它允许你监视一个或多个键,在 EXEC 执行之前,如果这些键被其他客户端修改过,那么整个事务将不会执行,EXEC 会返回 nil。WATCH必须在 MULTI 之前调用。
语法: WATCH key [key …]
使用示例:
打开两个redis-cli客户端
1、右侧客户端先监听user:1000:credits值,在开启事务。
2、左侧客户端重置user:1000:credits的值为3;
3、右侧客户端在自增user:1000:credits的值,在提交事务
4、返回nil,因为有其他的客户端修改了监听的值,所以事务失败了。
在这里插入图片描述

(4)、DISCARD

DISCARD 命令用于取消一个事务,清空事务队列,并恢复到正常状态。这意味着在 MULTI 和 DISCARD 之间的所有命令都不会被执行。DISCARD 通常在事务执行前发现某些条件不满足时使用,以避免执行不必要的命令。
语法: DISCARD
使用示例:
在这里插入图片描述

(5)、watch实现Redis事务锁(了解下):

Redis 事务本身并不提供锁机制,但它可以通过 WATCH 命令和乐观锁的概念来处理并发问题。
如下图的示例中,两个客户端同时修改INCR user:1000:credits的值,就会出现问题。
左侧客户端看到的结果是,3自增之后变成了5,是不是很奇怪?如果换成卖票的场景,最后一张票被卖了两次,余量变成了-1,那不就出大问题了吗?
在这里插入图片描述
解决思路:在操作之前锁定要操作的数据,一旦发生变化,终止当前操作。
具体做法:对目标key 通过添加watch监视,这样在提交事务的时候如果发现key的值被修改了,就不会执行事务。如,最初watch的示例一般。

再注意下:
关系型数据库执行的锁为悲观锁,Redis的watch命令是乐观锁。如果不想要watch监听了,可以使用unwatch取消对所有 key 的监视。
一但执行 EXEC 开启事务的执行后,无论事务是否执行成功, WATCH 对变量的监控都将被取消。
当事务执行即使是失败后,也需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。

3、redis事务异常处理机制

在 Redis 事务中,如果命令集合中的某个命令发生了错误,Redis 的行为取决于错误的类型。Redis 事务并没有提供像关系型数据库那样的回滚机制。这意味着一旦 EXEC 被调用,所有排队的命令都会被执行,即使其中一些命令失败了。

Redis 事务中的“失败”有两种情况:

(1)、语法错误(命令解析错误)

这类错误发生在命令被加入到事务队列时(即在 MULTI 和 EXEC 之间)。如果命令存在语法错误或使用了不存在的命令,Redis 会立即返回错误信息,并且不会将其加入队列。如下:
在这里插入图片描述
此时你可以选择取消事务(通过 DISCARD),或继续添加其他命令,最终执行时只会执行语法正确的命令。

(2)、运行时错误(命令执行错误)

这类错误发生在 EXEC 执行期间。当 Redis 执行事务中的命令时,如果某个命令由于某些原因无法完成(例如试图对非整数键进行递增操作),该命令会失败,但事务中的其余命令仍然会继续执行。
在这里插入图片描述
Redis 会为每个命令保留执行结果,包括失败命令的结果(通常是一个错误信息)。
因此,EXEC的返回值是一个数组,其中包含了每个命令的执行结果,可以用来检查哪些命令成功了,哪些命令失败了。

学海无涯苦作舟!!!

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

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

相关文章

简单网页制作提升用户体验和客户转化

在当今竞争激烈的市场中,用户体验和客户转化率往往是决定企业成败的关键。简单而高效的网页制作,正是提升用户体验和客户转化的重要手段之一。 首先,简洁的网页设计能够有效减轻用户的认知负担。当用户打开一个层次分明、界面整洁的网站时&am…

CDGA|数据治理:数据仓库”建设投入大、周期长怎么办?

在数据治理的广阔领域中,数据仓库的建设无疑是一项至关重要的任务。然而,这项任务往往伴随着巨大的投入和漫长的周期,成为许多企业面临的棘手问题。数据仓库作为数据存储、处理和分析的核心平台,其建设不仅需要大量的资金和技术支…

大中型水闸安全监测系统

一、背景 水闸作为水利工程中的重要组成部分,承担着调节水位、控制水流、防洪排涝等多重功能。然而,水闸在运行过程中会受到各种自然和人为因素的影响,导致其安全性能下降,甚至发生安全事故。为了保障水闸的安全运行,…

STL之空间配置器allocator

STL之空间配置器allocator 空间配置器的标准接口设计一个简单的空间配置器, JJ::allocator 具备次配置力(sub-allocation)的SGI空间配置器SGI标准的空间配置器, std::allocatorSGI特殊的空间配置器, std::alloc构造和析构基本工具:construct()和destroy()空间的配置与释放,std:…

人大金仓(KingBaseEs)数据库操作手册

人大金仓数据库(KingbaseES)是由北京人大金仓信息技术股份有限公司(简称人大金仓)自主研发的、具有自主知识产权的通用关系型数据库管理系统。 官方下载地址:KingbaseES 人大金仓数据库 KES技术文档在线手册&#xf…

容器镜像仓库

文章目录 1、docker hub1_注册2_登录3_创建容器镜像仓库4_在本地登录Docker Hub5_上传容器镜像6_下载容器镜像 2、harbor1_获取 docker compose 二进制文件2_获取harbor安装文件3_获取TLS文件4_修改配置文件5_执行预备脚本6_执行安装脚本7_验证运行情况8_访问harborUI界面9_har…

概率论相关知识随记

作为基础知识的补充,随学随记,方便以后查阅。 概率论相关知识随记 期望(Expectation)期望的定义离散型随机变量的期望示例:掷骰子的期望 连续型随机变量的期望示例:均匀分布的期望 期望的性质线性性质期望的…

如何解决压测过程中JMeter堆内存溢出问题

如何解决压测过程中JMeter堆内存溢出问题 背景一、为什么会堆内存溢出?二、解决堆内存溢出措施三、堆内存参数应该怎么调整?四、堆内存大小配置建议 背景 Windows环境下使用JMeter压测运行一段时间后,JMeter日志窗口报错“java.lang.OutOfMe…

快速了解 Aurora DSQL

上周在 AWS re:Invent大会(类似于阿里云的云栖大会)上推出了新的产品 Aurora DSQL[1] ,在数据库层面提供了多区域、多点一致性写入的能力,兼容 PostgreSQL。并声称,在多语句跨区域的场景下,延迟只有Google …

java垃圾回收机制中的引用计数算法

垃圾回收机制 java 语言中一个显著的特点就是引入了java回收机制,是c程序Q员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,iava中的额对象不在有“作用域”的概念,只…

android studio 读写文件操作(应用场景二)

android studio版本:2023.3.1 patch2 例程:readtextviewIDsaveandread 本例程是个过渡例程,如果单是实现下图的目的有更简单的方法,但这个方法是下一步工作的基础,所以一定要做。 例程功能:将两个textvi…

单片机C51--笔记8-STC89C51RC/RD-IIC协议

一、概述 IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式。 特点 简单性和有效性。 由于接口直接在组件之上,因此IIC总线占用的空间非常小…

小程序-基于java+SpringBoot+Vue的智慧校园管理系统设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Linux下的编程

实验7 Linux下的编程 一、实验目的 熟练掌握Linux下Python编程的方法、函数调用方法以及shell编程中的控制结构。 二、实验环境 硬件:PC电脑一台,网络正常。 配置:win10系统,内存大于8G ,硬盘500G及以上。 软件&a…

flink的安装配置(详细版本)

Standalone集群模式安装部署 conda deactivate 退出 base环境 Flink支持多种安装模式。 local(本地)——本地模式 standalone——独立模式,Flink自带集群,开发测试环境使用 standaloneHA—独立集群高可用模式,Fli…

【大语言模型】LangChain ModelsIO与Models I/O Promopts详解

【大语言模型】LangChain ModelsIO与Prompts详解 一、LangChain ModelsIO1、简介2、Models I/O 的应用场景3、Models I/O 主要模块3.1、Prompts3.2、Modelsa、MESSAGES 类型 3.3、Output Parsers 二、LangChain ModelsIO Prompts1、简介2、Prompts 的优点3、实战示例3.1、Promp…

Prometheus加入BasicAuth认证,通过配置 Prometheus 的 Web 身份验证来限制访问/debug/pprof/

Prometheus 作为监控工具,暴露了大量的系统监控数据和配置信息,这些数据可能包含敏感信息。Prometheus 默认没有身份验证,任何能够访问 Prometheus Web 界面的人都可以查看和查询这些数据。 此外Prometheus Web 界面的/debug/pprof/接口存在…

再谈多重签名与 MPC

目录 什么是 MPC 钱包以及它们是如何出现的 多重签名和智能合约钱包已经成熟 超越 MPC 钱包 关于小队 多重签名已经成为加密货币领域的一部分,但近年来,随着 MPC(多方计算)钱包的出现,多重签名似乎被掩盖了。MPC 钱包之…

QT 中基于 TCP 的网络通信

基础 基于 TCP 的套接字通信需要用到两个类: 1)QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。 2)QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。 这两个套接字通信类…

数值分析—数值积分

研究背景 积分的数学解法为牛顿莱布尼兹公式,数学表示为 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_{a}^{b} f(x)dxF(b)-F(a) ∫ab​f(x)dxF(b)−F(a),但应用该方法有如下困难: 1, f ( x ) f(x) f(x)的原函数有时不能用初等函…