Redis 的指令执行方式:Pipeline、事务与 Lua 脚本的对比

Pipeline

客户端将多条命令打包发送,服务器顺序执行并一次性返回所有结果。可以减少网络往返延迟(RTT)以提升吞吐量。

需要注意的是,Pipeline 中的命令按顺序执行,但中间可能被其他客户端的命令打断

典型场景:批量插入、查询或更新数据,也就是命令间没有什么依赖关系的情况。

比如下面这个例子,Pipeline 将 3 个 SET 打包发送,减少三次网络往返为一次。假设单次命令 RTT 为 1ms,3 次命令需 3ms;使用 Pipeline 仅需约 1ms。

SET key1 value1
SET key2 value2
SET key3 value3

事务

可以确保一组命令“原子”执行,确保一组命令执行过程中不被其他客户端打断如果事务中有命令失败,整个事务不会回滚,但后续命令不会执行

通常,它会结合 WATCH 来实现乐观锁

另外,Redis 中的原子性和 MySQL 中的原子性意义不同。MySQL 的原子性意味着,要么全部执行成功,要么就不执行,它会涉及回滚的操作。但 Redis 没有没有回滚的操作(为了性能,实现回滚需要维护事务日志等其他一些机制,会增加开销),它的原子性指,一组命令顺序执行,不会被其他命令打断。

还有,Redis 的事务并不会像 Pipeline 一样,将命令一起发送给 Redis,而是会一条一条发送。为什么?可以结合下面的过程,这样的话可以用来进行语法检查。

客户端发送 MULTI,开启事务。
客户端逐条发送命令(如 SET、INCR),每条命令立即传输到服务器。
服务器收到命令后,不执行,而是将其放入事务队列,并返回 QUEUED 响应。
客户端发送 EXEC,服务器原子性执行队列中的所有命令,并返回结果。
或者,客户端发送 DISCARD,清空队列,取消事务。

在实际使用中,比如在 Python 中的 redis-py 库,事务会以 Pipeline 的方式批量发送,来优化命令发送。

pipe = r.pipeline()  # 创建 Pipeline
pipe.multi()  # 开始事务
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.execute()  # 发送并执行事务

典型场景:需要保证数据一致性的操作,如转账、库存扣减。

WATCH accountA  -- 监控账户 A 的键,防止被其他客户端修改
MULTI
GET accountA -- 如果账户 A 的值发生改变,剩下的命令将不会执行
SET accountA $new_balanceA -- 更新账户 A 余额(减 100)
SET accountB $new_balanceB -- 更新账户 B 余额(加 100)
EXEC

Lua 脚本

Lua 脚本可以在一条命令中实现复杂逻辑,如条件判断、循环、错误控制。它和事务功能上有些相似,都是为了实现原子性。不过 Lua 脚本有两种选择,redis.call() 失败时脚本停止(前面已经执行完的命令不会受影响);redis.pcall() 捕获错误继续执行。

它比起事务有什么好处呢?

  • 比如事务中需要依赖于一个 GET 操作的结果,来决定后面的操作,事务无法实现,需要结合客户端的代码,加大了复杂性
  • 事务中的每条命令都会与 Redis 服务器进行网络交互,增加了客户端与服务器的交互

另外,为了避免每次都需要传输完整的 Lua 脚本给 Redis,Redis 还设立了一个缓冲区,来去存放 Lua 脚本的内容以及它的 SHA1 值(一种哈希算法,将 Lua 脚本内容映射为固定长度的唯一标识符)。之后只需传输对应的 SHA1 值即可执行对应的脚本。

总之,Lua 脚本会更灵活,事务能做的,Lua 都能做。所以能用 Lua 就用 Lua

典型场景:需要保证数据一致性的操作,如转账、库存扣减。和事务差不多。

local accountA = KEYS[1]    -- 账户 A 的键
local accountB = KEYS[2]    -- 账户 B 的键
local amount = tonumber(ARGV[1])  -- 转账金额(转换为数字)-- 获取账户 A 余额(不存在则默认为 0)
local balanceA = redis.call('GET', accountA) or 0
balanceA = tonumber(balanceA)-- 检查余额是否足够
if balanceA < amount thenreturn 0  -- 余额不足,返回 0
end-- 获取账户 B 余额(不存在则默认为 0)
local balanceB = redis.call('GET', accountB) or 0
balanceB = tonumber(balanceB)-- 执行转账
redis.call('SET', accountA, balanceA - amount)  -- 扣减账户 A
redis.call('SET', accountB, balanceB + amount)  -- 增加账户 Breturn 1  -- 转账成功,返回 1-- Redis 调用方式:
EVAL "local accountA = KEYS[1] local accountB = KEYS[2] local amount = tonumber(ARGV[1]) local balanceA = redis.call('GET', accountA) or 0 balanceA = tonumber(balanceA) if balanceA < amount then return 0 end local balanceB = redis.call('GET', accountB) or 0 balanceB = tonumber(balanceB) redis.call('SET', accountA, balanceA - amount) redis.call('SET', accountB, balanceB + amount) return 1" 2 accountA accountB 30

参考

  1. Redis 事务 vs Lua,区别以及如何选择
  2. 【Redis】- 事务和Lua脚本
  3. Redis 管道、事务、Lua 脚本对比

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

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

相关文章

Linux下的网络管理配置

一、 IPv4原理 IPv4&#xff08;Internet Protocol version 4&#xff09;&#xff0c;采用32位地址。IPv4地址通常用点分十进制表示&#xff0c;如 192.168.1.10。 IPv4网络通信基于数据包交换原理&#xff0c;当一台主机要向另一台主机发送数据时&#xff0c;会将数据分割成…

基于Python(Django)+SQLite实现(Web)校园助手

校园助手 本校园助手采用 B/S 架构。并已将其部署到服务器上。在网址上输入 db.uplei.com 即可访问。 使用说明 可使用如下账号体验&#xff1a; 学生界面: 账号1&#xff1a;123 密码1&#xff1a;123 账户2&#xff1a;201805301348 密码2&#xff1a;1 # --------------…

unity动态骨骼架设+常用参数分享(包含部分穿模解决方案)

Unity骨骼物理模拟插件Dynamic Bone Dynamic Bone 可用于对角色的骨骼&#xff08;bones&#xff09;或者铰链系统&#xff08;joints&#xff09;施加物理效果。 物理效果可以使得游戏角色的头发、衣服、胸部或者是其他的任何部位&#xff0c;都可以以近似真实的状态运动。 …

科技天眼守望农田:珈和卫星遥感监测赋能智慧农业,护航粮食安全新未来

农情监测与粮食安全密切相关&#xff0c;以往农作物的长势、环境、病虫害、灾情等相关数据和图像信息都是靠物联网硬件及县、镇、村等人力来完成&#xff0c;不仅要耗费大量人力、物力&#xff0c;而且数据时效性、准确性较差。珈和科技开发建设农情遥感监测系统&#xff0c;运…

【TeamFlow】4.2 Yew库详细介绍

Yew 是一个用于构建高效、交互式前端 Web 应用程序的现代 Rust 框架&#xff0c;它借鉴了 React 和 Elm 等框架的设计理念&#xff0c;同时充分利用 Rust 的语言特性。 核心特性 基于组件的架构 Yew 采用组件化开发模式&#xff0c;类似于 React: 组件是可重用的 UI 构建块 …

毕设 - 数字孪生智慧农场(vue+高德地图)项目分享

感兴趣的同学可以私信我或者在下方添加我的qq 在线地址: 数字孪生智慧农场

深入理解 VMware 虚拟机网络模式:为虚拟化管理铺平道路

随着云计算和虚拟化技术的快速发展&#xff0c;VMware作为行业领军者&#xff0c;在企业的IT基础设施中扮演着越来越重要的角色。无论是开发、测试还是生产环境&#xff0c;虚拟机&#xff08;VM&#xff09;都成为了我们不可或缺的工具。在VMware中&#xff0c;网络是虚拟机能…

安恒安全渗透面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

代码随想录算法训练营第五十三天 | 105.有向图的完全可达性 106.岛屿的周长

105.有向图的完全可达性 题目链接&#xff1a;101. 孤岛的总面积 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;图论&#xff1a;岛屿问题再出新花样 | 深搜优先搜索 | 卡码网&#xff1a;101.孤岛总面积_哔哩哔哩_bilibili 思路&#xff1a; 1.确认递归函数&…

蓝桥杯 18.分考场

分考场 原题目链接 题目描述 有 n 个人参加某项特殊考试。 为了公平&#xff0c;要求任何两个认识的人不能分在同一个考场。 你的任务是求出最少需要分几个考场才能满足这个条件。 输入描述 第一行&#xff1a;一个整数 n&#xff0c;表示参加考试的人数&#xff08;1 ≤…

分布式光纤测温技术让森林火灾预警快人一步

2025年春季&#xff0c;多地接连发生森林火灾&#xff0c;累计过火面积超 3万公顷。春季历来是森林草原火灾易发、多发期&#xff0c;加之清明节已到来&#xff0c;生产生活用火活跃&#xff0c;民俗祭祀用火集中&#xff0c;森林火灾风险进一步加大。森林防火&#xff0c;人人…

前端笔记-Vue3(上)

学习参考视频&#xff1a;尚硅谷Vue3入门到实战&#xff0c;最新版vue3TypeScript前端开发教程_哔哩哔哩_bilibili vue3学习目标&#xff1a; VUE 31、Vue3架构与设计理念2、组合式API&#xff08;Composition API&#xff09;3、常用API&#xff1a;ref、reactive、watch、c…

如何增加 Elasticsearch 中的 primary shard 数量

作者&#xff1a;来自 Elastic Kofi Bartlett 探索增加 Elasticsearch 中 primary shard 数量的方法。 更多阅读&#xff1a; Elasticsearch&#xff1a;Split index API - 把一个大的索引分拆成更多分片 Elasticsearch&#xff1a;通过 shrink API 减少 shard 数量来缩小 El…

基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线。输出指标包括最小平均流动时间&#xff0c;最大完工时间&#xff0c;最小间隙时间。 2…

Spring_MVC 快速入门指南

Spring_MVC 快速入门指南 一、Spring_MVC 简介 1. 什么是 Spring_MVC&#xff1f; Spring_MVC 是 Spring 框架的一个模块&#xff0c;用于构建 Web 应用程序。它基于 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将应用程序分为模型&#xff08;M…

爬虫获取sku信息需要哪些库

在使用 Python 爬虫获取淘宝商品的 SKU 详细信息时&#xff0c;通常需要以下几种库来完成任务。这些库各有其用途&#xff0c;可以帮助你更高效地实现爬虫功能。 1. requests 用途&#xff1a;用于发送 HTTP 请求&#xff0c;获取网页内容。 安装&#xff1a; bash pip insta…

赛灵思Xilinx FPGa XCKU15P‑2FFVA1156I AMD Kintex UltraScale+

XCKU15P‑2FFVA1156I 是 AMD Kintex UltraScale 系列中的高性能 FPGA&#xff0c;基于 16 nm FinFET UltraScale 架构 制造&#xff0c;兼顾卓越的性能与功耗比&#xff0c;该器件集成 1,143,450 个逻辑单元和 82,329,600 位片上 RAM&#xff0c;配备 1,968 个 DSP 切片&#…

从规则到大模型:知识图谱信息抽取实体NER与关系RE任务近10年演进发展详解

摘要: 本文回顾了关系抽取与实体抽取领域的经典与新兴模型,清晰地梳理了它们的出现时间与核心创新,并给出在 2025 年不同资源与场景下的最佳实践推荐。文章引用了 BiLSTM‑CRF、BiLSTM‑CNN‑CRF、SpanBERT、LUKE、KnowBERT、CasRel、REBEL、UIE,大模型抽取 等模型的原始论…

基于Django实现农业生产可视化系统

基于Django实现农业生产可视化系统 项目截图 登录 注册 首页 农业数据-某一指标表格展示 农业数据-某一指标柱状图展示 农业数据-某一指标饼状图展示 气候数据-平均气温地图展示 气候数据-降水量合并图展示 后台管理 一、系统简介 农业生产可视化系统是一款基于DjangoMVTMyS…

【无人机】无人机的电调校准,ESC Calibration,PX4使用手册电调校准详细步骤

目录 1、前提 条件​ 2、详细步骤​ 3、故障 排除​ 无人机的电调校准&#xff0c;ESC Calibration&#xff0c;PX4使用手册电调校准详细步骤 参考&#xff1a;ESC 校准 |PX4 指南 &#xff08;v1.15&#xff09; ​信息 这些说明仅与 PWM ESC 和 OneShot ESC 相关。DShot…