【二十六】redis之事务、事务特性、与pipeline比较,与Lua脚本比较

redis 管道(pipeline)、事务(multi)、普通、lua脚本性能对比 <?php set_time_limit(0); ini_set('memory_limit','1024M'); $redis = new Redis(); G('1'); $redis->connect('127.0.0.1'); //不具备原子性 ,管道 //$redis->pipeline(); $redis->multi($redis::PIPELINE); for ($i=0;$i<100000;$i++) { $redis->set("test. 阅读详情

一、redis事务的特性

1.原子性

这里的原子性跟mysql的原子性不一样。

redis事务的原子性是说的:一次事务提交的多个命令,要么都不执行(watch发现某个key的值变了则不开始执行),要么所有的命令都执行(一旦开始执行事务,事务中所有的命令都会执行,即使有命令报错了,后面的命令也会执行)

报错不回滚! 

不回滚的原因:

● Redis 命令只会因为错误的语法而失败,失败的命令是由编程错误造成的。而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。

● 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

2.持久性

只在特殊情况下有持久性。也就是做了持久化之后。且用AOF持久化,用always策略,保证每次操作都持久化。

3.隔离性

4.一致性

二、比较

1.redis事务跟redis pipeline相比

1.pipeline是只有一次网络开销执行多个命令,而redis事务是N次网络开销执行N次命令。

2.pipeline不具备原子性,redis的事务具备原子性。

pipeline可能存在的场景是:

pipeline 中执行命令1 命令2 命令3  其他非pinpeline执行命令4 命令5

最后的结果可能是

命令1 命令4 命令2 命令5 命令3

2.redis事务跟redis lua相比

redis用multi命令开启事务后,后面的命令都是放入队列中,遇到exec再真正的执行,放入队列中的命令不会立马返回结果,只是返回QUEUED表示成功放入命令。EXEC统一执行了之后统一返回每个命令的结果。

换句话说,如果我们想实现这个场景,用redis的事务就实现不了:

得到key=age1的数据,如果该数据存在且该数据为100,那么删掉该数据,否则不做操作。

因为在事务中get age1命令返回的时QUEUED,并不是返回的age1的值

而这个场景用redis lua脚本可以实现

三、事务相关的命令

1.MULTI

用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行EXEC时这些命令才会被执行。或者遇到DISCARD命令

可以看到开启事务后,每次命令只是进入了该事务的命令队列,返回的是QUEUED,得执行了EXEC后才真的执行这些命令返回命令对应的执行结果。

2.EXEC

执行在一个事务内命令队列中的所有命令,同时讲当前状态回复为正常状态,即是非事务状态。

如果在事务中执行了watch命令,那么只有当watch所监控的keys没有被修改的前提下,EXEC命令才能执行事务队列中所有的命令,否则EXEC讲放弃当前事务中的所有命令。

3.DISCARD

回滚事务队列中的所有命令,同时再将当前连接的事务状态恢复为正常状态,即是非事务状态。

如果WATCH命令被使用,该命令将UNWATCH所有的keys

可以看到并没有返回test_key_1的结果,也没有执行set test_key_2

4.WATCH

WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。

在MULTI命令执行前,可以WATCH指定待监控的keys,然后在执行EXEC前,如果被监控的keys发生修改,那么整个事务都会被取消, EXEC 返回空多条批量回复(null multi-bulk reply)来表示事务已经失败。

WATCH 使得 EXEC 命令需要有条件地执行: 事务只能在所有被监视键都没有被修改的前提下执行, 如果这个前提不能满足的话,事务就不会被执行

5.UNWATCH

取消当前事务中指定监控的keys,如果执行了EXEC或DISCARD命令,则无需再手工执行UNWATCH命令了。

6.测试报错

1.在执行EXEC前,如果有很明显的错误,则不会开始执行事务

比如事务在执行 EXEC 之前,入队的命令可能会出错(比如:命令产生语法错误(参数数量错误,参数名错误,等等))

2.已经开始执行EXEC,发现有命令报错了(比如:事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面)

这里可以看到虽然第二条命令报错了,但是第三条命令也执行,第一条命令也执行了没有回滚

计算光刻效率革命:为什么Hopkins模型比Abbe模型快?深入解析TCC的魔力 本文深入解析了计算光刻中Hopkins模型相比Abbe模型的效率优势,重点探讨了TCC(透射交叉系数)的工程智慧。通过预计算光学系统特性并复用TCC矩阵,Hopkins模型实现了数量级的加速,特别适用于复杂照明条件下的光刻仿真。文章详细介绍了TCC的物理意义、模态分解技术以及GPU并行计算等关键加速策略,为半导体制造中的光刻工艺优化提供了实用见解。 阅读详情

相关推荐

vivado 工程修改芯片型号

vivado工程芯片与实际板子不匹配时,需要修改工程的芯片型号,并对原工程的ip进行同步更新,之后生成新的bit文件,烧录到板子中

k7126685的博客 1万+

redis 事务和lua 脚本的比较

redis 事务与Lua脚本 一.原理 1.redis事务 2.lua脚本 3.两者异同 相同点 不同点 二.问题 1.使用场景是什么 秒杀 限流 2.如何选择 一.原理 1.redis事务 基本原理为乐观锁,多个client对操作的key进行watch,一旦有一个client进行了exec,那么其它client的exec就会失效。其实现原理可参考 Redis watch机制的分析。 2.lua...

u013452337的博客 4133

实施文档

流程管理 2008-04-23 09:44:00 874 收藏 3 分类专栏: 企业管理杂谈 文章标签: 文档 文档管理 项目管理 工作 配置管理 工具 项目实施文档是用来记录、描述、展示实施过程中一系列信息的处理过程,通过书面或图示的形式对项目活动过程或结果进行描述、定义、规定及报告。例如分阶段实施计划文档,标准业务流程文档,标准编码及数据文档,标准参数设置文档,功能操作指南文档。这些文档将会伴随着ERP实施的各个阶段逐渐充实、完善,也同时记载了整个实施的过程和成果。 作为实施顾问人员,在实施过程

qq_52337172的博客 1062

redis事务-pipeline-lua三者区别简单概括

简单聊聊

ws_please的博客 1092

学习笔记——神经科学的数学基础

m%3D2X_%7Bi%7DiNy%3DAxW%3DABx_%7Bj%7Dy_%7Bi%7Dy%3DWxt=N7T8卷积神经网络(CNN)详细介绍及其原理详解_IronmanJay的博客-优快云博客https://blog.youkuaiyun.com/IronmanJay/article/details/128689946?

zxyopenstar的博客 1374

DVWA靶场实战:手把手教你绕过文件上传限制,用蚁剑连接一句话木马

本文详细介绍了在DVWA靶场中如何绕过文件上传限制并利用蚁剑连接一句话木马的实战技巧。通过分析文件上传漏洞原理、创建一句话木马、使用Burp Suite拦截修改请求以及配置蚁剑连接WebShell的全过程,帮助安全研究人员深入理解Web安全防护与攻击技术。

weixin_30335575的博客 90

Redis 管道、事务、Lua 脚本对比

概述 Redis 提供三种将客户端多条命令打包发送给服务端执行的方式: Pipelining(管道) 、 Transactions(事务) 和 Lua Scripts(Lua 脚本)。本文不会过细的讨论三种方式的基础知识,将从这三种方式的 优势 、 局限性 和 原子性 方面展开讨论 Pipelining(管道) Redis 管道是三者之中最简单的,当客户端需要执行多条 redis 命令时,可以通过管道一次性将要执行的多条命令发送给服务端,其作用是为了降低 RTT(Round Trip Time) 对性能的影

黄晓宇的博客 2908

告别Link180!在Ansys Mechanical 2020R2中正确启用Cable280绳索单元(附Beta选项开启指南)

本文详细介绍了在Ansys Mechanical 2020R2中启用Cable280绳索单元的全过程,包括Beta选项的开启步骤、建模技巧及高阶应用。Cable280作为专为绳索仿真设计的单元,相比传统的Link180单元,在大变形模拟和计算效率上表现更优,特别适合斜拉桥、电梯牵引绳等工程场景。

weixin_33711647的博客 405

Redis系列十:Pipeline详解

1、pipeline出现的背景: redis客户端执行一条命令分4个过程: 发送命令-〉命令排队-〉命令执行-〉返回结果 这个过程称为Round trip time(简称RTT, 往返时间),mget mset有效节约了RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,这个时候需要pipeline来解决这个问题 2、pepeline的性能 ...

w1lgy的博客 10万+

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 459

随机化策略——随机变量rand、约束constraint、权重dist、随机数产生示例

文章目录一、随机变量类型1.1.rand随机变量1.2.randc随机变量二、随机化约束2.1.constraint指定约束范围2.1.1.关系操作符约束(>、<、=、>=、<=)2.1.2.范围操作符约束(inside)2.1.3.权重分布约束(dist)2.1.4.条件约束(if-else; ->)三、启动随机化——randomize( )函数四、关闭或打开随机变...

Mr.翟的博客 2万+

Redis事务与Pipeline功能

一、Redis事务 Redis中的事务(transaction)是一组命令的集合,对事物的支持有限,不能保证原子性,在集群分片环境中,由于不同key可能存在不同的机器上,所以造成事务无法使用(可以简单使用,不推荐) 事务相关命令 multi命令,用于开启事务,标记一个事务块的开始,事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 exec命令原子性(atomic)地执行 exec命令,...

LJJZJ的博客 2120

长上下文技术的底层逻辑:Attention、压缩、缓存与跨页推理

如果把模型的参数视为“固化智能”,动态智能(Dynamic Intelligence)——模型不必依赖训练时的记忆,而是可以随时调用外部信息。这一点正在改变大模型的范式:Prompt 不再是输入,而是“操作系统事件”文档不再是知识,而是“模型的临时记忆”模型不再是一段神经网络,而是一个“具备阅读循环的推理引擎”当我们把上下文从 128K 拉到百万级,我们做的不是扩容,而是让模型第一次拥有阅读、回溯、定位、跨页分析的能力。这是一种新的智能。

aifs2025的博客 997

Redis管道(pipeline)详解

这里写目录标题pipeline出现的背景原生批命令(mset, mget)与Pipeline对比pipeline的使用注意事项 pipeline出现的背景 redis客户端执行一条命令分4个过程: 发送命令-〉命令排队-〉命令执行-〉返回结果 这个过程称为Round trip time(简称RTT, 往返时间),Redis的原生批命令(mget和mset)有效节约了RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,这个时候需要pipeline来解决这个

TABE_的博客 4505

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

redis事务和lua脚本异同,Redis分布式锁的缺点

redis事物和lua脚本: 1.redis事务 基本原理为乐观锁,多个client对操作的key进行watch,一旦有一个client进行了exec,那么其它client的exec就会失效。其实现原理可参考 Redis watch机制的分析。 2.lua脚本 基本原理为使脚本相当于一个redis命令,可以结合redis原有命令,自定义脚本逻辑。 两者异同 相同点:很好的实现了原子性、一致性、隔离性和持久性,无论是redis事务,还是lua脚本,如果执行期间出现运行错误,之前的执行过的命令是不会回滚的。

jxlxx_023的博客 1777

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

redis中的multi和pipeline

事务块 multi redis中的 multi 方法,提供了一个队列用于缓存多个指令,...

aben_sky的专栏 1869

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Redis事务和Lua脚本对比

在 Redis 中,和都是用于确保一组操作以原子方式执行的机制。它们有各自的优缺点,适用于不同的场景。下面我将详细对比它们的优缺点,以帮助你更好地理解它们的区别,并选择最适合你的需求的技术。

lijunjun的专栏 856

Redis事务、lua脚本

multi相当于开始事务,他不会立刻执行命令,而且将其加入队列,当你执行exec才会执行,我们看到第三条命令,c的值并不是一个值,是一个字符串,命令加入队列时并不会去检查。移动到链表头,不常访问的自然靠近链表尾,如果超过容量、个数限制,移除尾部的。如果访问了某个 key,则它就变成最新的。检查是否超过限额,是则删除最后一个节点,并断开它的链接。时间上,新的留下,老的淘汰。随机取样法,链表法占用内存较多,记录了它们的最近访问时间,在这。使用的是随机取样法,每次只抽。获取,没有新建节点,存入。

weixin_43162044的博客 1040

Redis——“事务“/Lua脚本

Redis——“事务“/Lua脚本

娜娜米的博客 2585

redis的事务与管道有什么不同?

事务(MULTI/EXEC:适用于需要保证一系列命令的原子性和顺序性的场景,尤其是在并发情况下,可以确保一组命令不被其他客户端打断。管道(PIPELINE:主要用于提升性能,减少网络延迟,适合批量操作,但它不保证命令的原子性,也不具有隔离性。

jkzyx123的博客 1570

七、事务与Lua

为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题。本节首先介绍Redis中事务的使用方法以及它的局限性,之后重点介绍Lua语言的基本使用方法,以及如何将Redis和Lua脚本进行集成,最后给出Redis管理Lua脚本的相关命令。 一、事务 熟悉关系型数据库的读者应该对事务比较了解,简单地说,事务表示一组动作,要么全部执行,要么全部不执行。例如在社交网站上用户A关注了用户B,那么需要在用户A的关注表中加入用户B,并且在用户B的粉丝表中添加用户A,这两个行为要么全部执

苏迪的博客 439

Redis的Pipeline和事务(进阶篇)

前面我们已经说过,Redis客户端执行一条命令分为如下4个部分1)发送命令2)命令排队3)命令执行4)返回结果使用Pipeline 执行了n次命令,整个过程需要1次RTT。Pipeline并不是什么新的技术或机制,很多技术上都使用过。而且RTT在不同网络环境下会有不同,例如同机房和同机器会比较快,跨机房跨地区会比较慢。redis-cli的--pipe选项实际上就是使用Pipeline机制,但绝对部分情况下,我们使用Java语言的Redis客户端中的Pipeline会更多一点。运行结果。

爱晴禹 1482

Redis Pipeline(管道)与事务的区分

管道通常比事务执行速度更快,因为它批量发送和接收响应,减少了往返时间。事务提供原子性保证,而管道中的命令在整体上并不具备原子性。使用管道时,要注意一组命令之间的独立性,而事务更适用于需要一组命令以原子方式执行的场景。参考资料:《Redis 开发与运维》

weixin_42576071的博客 1724

Redis7——基础篇(四)

本篇旨在学习redis的事务、管道、发布订阅三个功能,在实际项目开发过程中,可依据具体业务需求,灵活运用上述功能,充分发挥 Redis 的技术优势,从而有效提升系统性能与用户体验。

想飞的dragon 1324

你能说说Redis中Pipeline和事务的区别吗

你能说说Redis中Pipeline和事务的区别吗

舒一笑的博客 378

Redis中lua脚本和pipeline的区别

一、lua脚本一般我会用lua脚本来代替。官方默认lua脚本是原子性的,应该是和MySQL的原子行差不多的。lua脚本的所有命令要么全部执行成功要么全部执行失败。一般是做一些逻辑比较严密的处理。阻塞其他redis操作,直到lua脚本完全执行完毕才会执行其他命令。我认为lua可以执行批量处理如果lua脚本执行的时间太长,那么要优化下lua脚本,因为lua会阻塞其他操作,所以说lua脚本不适合执行太长时间。三、pipeline1、批量处理数据,一次性返回所有结果集。

qq_37080455的博客 1032
上一篇: 分布式缓存Redis之Pipeline(管道)
下一篇: Redis系列十二:Redis高可用之持久化
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值