Redis事务和Redis管道

news2025/1/13 13:17:45
什么是Redis事务:Redis事务是指将多条命令加入到队列里面,一次批量执行多条命令,每一条命令会按顺序执行,在事务执行过程中不会受到客户端所传入的命令请求的影响
1)单独的隔离操作:Redis的事务仅仅保证事务 里面的操作会被连续独占的执行,redis命令执 行是单线程架构 ,在执行完事务内所有 指令前是不可能再去同时执行其他客户端的请求的

2)没有隔离级别的概念:存在watch命令来进行事务开启之前监视任意数量的key,当进行调用exec执行事务的时候,如果任意一个被监视的key已经被其他客户端修改了,那么整个事务不再执行,直接返回失败,可以说Redis没有事务隔离级别的概念;

3)不一定会保证原子性:Redis不会提供事务回滚的功能,开发者必须在事务执行出错之后自行恢复数据库的状态,没有执行到一半回滚的能力,不能保证所执行的执行全部成功或者全部失败,只有决定事务是否开始执行全部指令的能力;

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的

3.1)全体连坐入队错误(编译时异常):在我们开启multi命令的时候,我们执行命令set k1 v1,set k2 v2,但是当我们进行执行set k3,故意把命令写错,这样语法编译就不通过,一个语法出错,全体连坐,任何一个命令语法出错,Redis就会直接返回错误信息,所有的命令都不会被执行,

3.2)源头寨主(运行时异常),如果不是redis命令的语法错误,而是在执行命令的时候发生了错误,那么对应的命令不会执行,但是其他没有出现错误的命令则会被正常执行

如果命令在事务执行的过程中发生错误,比如说,对一个不同类型的 key 执行了错误的操作, 那么 Redis 只会将错误包含在事务的结果中, 这不会引起事务中断或整个失败,不会影响已执行事务命令的结果,也不会影响后面要执行的事务命令, 所以它对事务的一致性也没有影响

4)排他性:Redis会保证一个事务内的命令依次执行,而不会被其他命令插入;

5)持久性:因为事务不过是用队列包裹起了一组 Redis 命令,并没有提供任何额外的持久性功能,所以事务的持久性由 Redis 所使用的持久化模式决定

Redis中的事务命令:

1)discrd:取消事务,放弃执行事务块中的全部命令,它清空客户端的整个事务队列, 然后将客户端从事务状态调整回非事务状态, 最后返回字符串 OK 给客户端, 说明事务已被取消

2)exec:提交事务

3)multi:开启事务

4)unwatch:取消watch命令针对于所有key的监视

Watch原理:是一个乐观锁的实现,Redis在进行修改的时候会进行检测数据是否被修改,如果被修改了,那么执行失败

watch命令用于在事务开启之前进行监视任意数量的键,当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败

1)悲观锁:在每一次拿到数据的时候都会认为别人会修改,因此在每一次拿数据的时候都会上锁,别人拿数据就要阻塞等待释放锁;

2)乐观锁:认为每一次拿数据的时候别人都不会进行修改,所以不会上锁,但是在进行更新的时候会进行判断一下有没有人更新过这个数据,提交版本必须大于当前版本才会执行更新

3)watch key1 key2: 监视一或多个key,如果在事务执行之前,被监视的key被其他命令改动,则事务被打断;

 

 

但是一旦执行了exec命令之前加的所有的监控锁都会被取消掉,当客户端连接丢失的时候,比如说退出链接,那么所有的东西都会被取消监视

总结:使用multi开启一个事务,入队的时候将多个命令入队到事务中,接收到这些命令并不会立即执行,而是放到等待执行的任务队列里面,最后由exex触发事务

Redis管道:

1)因为客户端向服务器发送命令分为四步,发送命令,命令排队,命令执行,返回结果,并且监听Socket返回,通常以阻塞模式等待服务器端响应,

2)服务器处理命令,并将结果返回给客户端

以上两步简称为是Round Trip Time,简称为是RTT是数据包往返于两端的时间

3)如果同时需要执行大量的命令, 那么就需要等待上一次命令应答过后再去执行,这中间不仅多了RTT(Round Time Trip),而且还需要进行频繁调用操作系统的IO,发送网络请求,同时需要Redis多次调用read()和write()的系统方法,系统方法将会将数据从用户态转移到内核态,这样就会对进程上下文产生比较大的影响了,效果不太好;

4)Pipeline是为了解决RTT往返的时候,仅仅是将命令打包一次性发送,对整个Redis的执行不会造成其他的任何的影响

 

 

管道和原生命令的区别:

1)原生批量的命令是原子性,比如说mget和mset,但是pipeline是非原子性

2)原生批量命令一次只能执行一种命令,但是pipeline是支持批量执行不同的命令

3)原生批量命令是依靠服务器端实现的,但是pipeline需要服务器端和客户端共同完成

事务和管道的区别:

1)事物具有原子性,但是管道不具有原子性

2)管道是一次性将命令发送到服务器,但是事务是一条一条的发,十五只有接收到exec命令的时候才会执行;

3)执行事务的时候会进行阻塞其他命令的执行,但是执行管道中的命令不会阻塞

总结:

1)管道的缓冲的指令只是会依次执行,是不会保证原子性的,如果执行的过程中发现指令发生异常,那么将会执行后续的指令;

2)使用管道进行组装的命令不要太多,不然会因为数据量过大导致客户端阻塞的时间可能会太久,此时服务器端也会被迫回复一个队列答复,不然会占用内存;

 

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

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

相关文章

【Rust 日报】2023-05-21 Helix 23.05发布

Helix 23.05发布 Helix 是个文本编辑器: 新版本功能: 为 LSP 引用请求添加一个配置选项,用于排除声明(#6886)。根据文件扩展名和 shebang 启用语言注入(#3970)。通过最近…

Vision-CAIR/MiniGPT-4:使用先进的大型语言模型增强视觉-语言理解

Vision-CAIR/MiniGPT-4:使用先进的大型语言模型增强视觉-语言理解 摘要 视觉-语言理解是人工智能领域的一个重要方向,它涉及到图像和文本之间的复杂交互。近年来,大型语言模型(LLM)在自然语言处理(NLP&am…

【PCIE732】基于 Kintex UltraScale 系列FPGA 的2 路40G 光纤通道适配器(5GByte/s 带宽)/XCKU060

板卡概述 PCIE732 是一款基于PCIE 总线架构的高性能数据传输卡,板卡具有1 个PCIex8 主机接口、2 个QSFP40G 光纤接口,可以实现2路QSFP 40G 光纤的数据实时采集、传输。板卡采用Xilinx 的高性能Kintex UltraScale 系列FPGA 作为实时处理器,板…

【Nginx】反向代理

文章目录 Nginx反向代理概述Nginx反向代理的配置语法proxy_passproxy_set_headerproxy_redirect Nginx反向代理实战Nginx的安全控制如何使用SSL对流量进行加密nginx添加SSL的支持Nginx的SSL相关指令生成证书开启SSL实例 反向代理系统调优 Nginx反向代理概述 关于正向代理和反向…

IIC-EEPROM实验

IIC I2C介绍I2C物理层(内部结构)I2C协议层数据有效性起始和结束信号应答响应时序图 数据传输软件模拟IIC使用方法产生IIC起始信号产生IIC停止信号产生ACK应答产生nack非应答等待应答信号到来IIC发送一个字节IIC读一个字节 AT24C02介绍硬件设计软件设计实…

chatgpt赋能Python-python_if_非

Python中的if非语句在SEO中的重要性 在Python编程中,if非语句是必不可少的一部分。它让程序员能够编写条件语句,根据不同的条件执行不同的代码。但你知道吗?if非语句也可以对SEO(搜索引擎优化)产生深远的影响。 什么…

cannot read system data from XML file

最近在使用ccs进行debug仿真时,不知道为什么一直报错,或者偶尔能够正常下载程序。一些报错情况如下: One or more sections of your program falls into a memory region that is not writable. Invalid Target Configuration file 有可能…

【容器化应用程序设计和开发】2.7 云原生开发工具和框架

2.7 云原生开发工具和框架 今天我们就简单来讲一下云原生下用到的开发工具和一些基本的框架。云原生开发工具和框架是为了支持现代化的应用程序开发,能够简化云原生应用程序的构建、部署、管理和维护。下面是一些常见的云原生开发工具和框架: Kubernetes…

给初学者的Vue.js项目搭建教程

部分数据来源:ChatGPT 1. 环境准备 在开始创建 Vue.js 项目前,需要保证已经安装了 Node.js(建议版本12)和 NPM(Node.js 自带的包管理工具)。 可以执行以下命令确认是否已经安装: node -v np…

数字孪生智慧灯杆,“多杆合一”降本增效

随着智慧城市建设的不断深入,智慧灯杆作为城市基础设施的重要组成部分,正在成为城市智能化和绿色化的重要手段之一。 图扑智慧灯杆系统在城市道路照明领域引入信息化手段,通过构建路灯物联网,实现了现代化的路灯按需维修和按需照…

【1】安装与配置tensorflow

常见深度学习框架市场占有率 1.创建虚拟环境 打开菜单栏里的 点击creat创建 2.激活虚拟环境 打开命令提示符,输入activate tensorflow 可以看到进入tensorflow环境: 3.更换源 为提高下载速度,执行以下命令: pip config set g…

SpringCloud Ribbon和OpenFeign组件的使用加示意图和详细讲解

目录 SpringCloud Ribbon Ribbon 介绍 LB(Load Balance) LB 分类 1. 集中式LB 2. 进程内LB 实例-前面member-consumer 轮询负载访问10000/10002 底层就是Ribbon 默认的轮询负载算法 Ribbon 架构图&机制 Ribbon 机制 Ribbon 常见负载算法 替换负载均衡算法-应用实…

CCS新建工程教程

1.先点击ccs软件,打开一个工作台: 2.点击“Project”菜单,选择“New CCS Project”项目,新建 CCS 工 程 3. ①:我们开发板上使用的 DSP 芯片是 TMS320F28335,所以这里我们选择 TMS320F28335。 ②&#xff…

一文读懂Vite和Webpack的区别?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、webpack是什么?二、webpack如何工作?三、Vite是什么?Vite和Webpack的区别? 提示:以下是本篇文章正文…

【Nginx】负载均衡

文章目录 负载均衡概述负载均衡的原理及处理流程负载均衡常用的处理方式方式一:用户手动选择方式二:DNS轮询方式方式三:四/七层负载均衡 Nginx七层负载均衡的指令upstream指令server指令 Nginx七层负载均衡的实现流程负载均衡状态负载均衡策略负载均衡案例案例一:对…

“多杆合一”降本增效——数字孪生智慧灯杆

随着智慧城市建设的不断深入,智慧灯杆作为城市基础设施的重要组成部分,正在成为城市智能化和绿色化的重要手段之一。 图扑智慧灯杆系统在城市道路照明领域引入信息化手段,通过构建路灯物联网,实现了现代化的路灯按需维修和按需照…

Windows与Linux系统实现文件互传(通俗易懂)

SCP指令可以实Windows系统与Linux系统之间的文件互传 引言Windows系统文件传输到Linux系统上(先操作)Windows系统文件传输到Linux系统上(再细聊)Linux系统文件传输到Windows系统上(先操作)Linux系统文件传输…

【PCIE702-1】基于Kintex UltraScale系列FPGA的高性能PCIe总线数据预处理载板

板卡概述 PCIE702-1是一款基于PCIE总线架构的高性能数据预处理FMC载板,板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器,实现各个接口之间的互联。板卡具有1个FMC(HPC)接口,1路PCIe x8主机接口&#x…

【首发】全道科技轻地图数据闭环解决方案

近日,全道科技执行董事王闯在WGDC 2023进行了《从‘重感知、轻地图’看城市NOA解决方案创新与发展》的主题演讲,不仅从高精地图自动化量产技术服务商角度,以更加专业的视角阐释了自动驾驶实现“轻地图”的路径,同时发布了基于此趋…

域名所有权验证教程

申请域名型证书,可以通过以下方式验证域名的所有权:1. 文件验证(云建站主机请选择dns方式)2. 手动DNS验证 3. 自动DNS验证 申请域名型证书,可以通过以下方式验证域名的所有权: 1. 文件验证 根据提示需要创…