Redisson中为什么用lua脚本不用事务
一文详解事务和lua脚本的区别
核心问题: 为什么 Redisson 在实现分布式锁、信号量等复杂对象时,倾向于使用 Lua 脚本,而不是 Redis 内建的事务 (MULTI/EXEC)?
结论概览: Lua 脚本为 Redisson 提供了更强的原子性保证、更复杂的服务器端逻辑处理能力,以及更低的通信开销,这使得实现健壮且高效的分布式对象成为可能。
Lua 脚本的执行具有原子性,这意味着:
-
阻塞性: 一旦一个 Lua 脚本开始执行,Redis 服务器会阻塞所有其他客户端的命令(除了 SCRIPT KILL 和 SHUTDOWN NOSAVE 等少数命令),直到该脚本执行完毕。
-
隔离性: 在脚本执行期间,它所操作的数据就像被“冻结”了一样,不会受到来自其他并发命令的影响。脚本看到的是它开始执行那一刻的数据快照(对于它读取的键)。
详细解释:
-
Redis 事务 (MULTI/EXEC) 的特点与局限性:
-
工作原理: 使用
MULTI
开始一个事务块,后续命令进入队列,直到遇到EXEC
命令才会被服务器依次执行。WATCH
命令用于监视某些键,如果在EXEC
执行前这些键被修改,事务将被打断 (EXEC 返回 Null Reply)。 -
原子性: Redis 事务的原子性指的是执行原子性。一旦
EXEC
被触发,队列中的所有命令要么全部被服务器接受并执行,要么一个都不执行(如果 WATCH 的键被修改)。但它不是严格的事务原子性:如果队列中的命令本身有错误(如对字符串键执行列表操作),这些错误会在执行阶段才被发现,错误命令会失败,但队列中的其他命令仍然会执行(取决于错误类型和 Redis 版本,但与传统数据库的严格 ACID 原子性不同)。 -
逻辑能力弱: 事务块内的命令是简单的顺序执行。无法根据前一个命令的执行结果来决定后续命令的行为(没有 if/else 分支)。复杂的逻辑判断必须在客户端完成,这意味着需要多次网络往返。
-
通信开销: 执行一个包含复杂逻辑的事务可能需要:
WATCH
->GET
(客户端获取状态) -> (客户端根据状态判断) ->MULTI
->SET/INCR/...
->EXEC
。至少需要 3-4 次网络往返,效率较低。 -
WATCH 的限制
WATCH
只能检测键 是否被修改,不能执行更精细的条件判断(例如,“如果键的值小于某个数”)。如果 WATCH 失败,客户端需要重试整个操作流程,增加了客户端的复杂性和潜在的竞争。
-
-
Redis Lua 脚本的特点与优势:
-
工作原理: 使用
EVAL script numkeys key [key ...] arg [arg ...]
将整个 Lua 脚本发送到 Redis 服务器执行。脚本在服务器端运行。 -
强原子性: Lua 脚本的执行是完全原子性的。一个脚本在执行期间,不会被任何其他命令打断。脚本要么完整执行成功,要么在出错时停止,所有操作是原子的(从外部看,就像一个命令)。
-
逻辑能力强: Lua 是一种功能完整的脚本语言,支持条件判断 (
if/else
)、循环 (for/while
)、变量、函数调用等。这使得可以在服务器端实现复杂的业务逻辑,根据实时获取的键值进行判断和操作,无需客户端多次介入。 -
通信开销低: 整个复杂操作的逻辑都封装在一个脚本中。客户端只需要发送一次
EVAL
命令(或使用SCRIPT LOAD
预加载脚本后发送EVALSHA
),就可以执行整个操作。通常只需要一次网络往返(除了第一次加载脚本)。 -
性能优势: 减少了客户端与服务器之间的频繁通信,降低了延迟,提高了吞吐量。
-
脚本缓存: Redis 会缓存执行过的脚本,后续可以使用脚本的 SHA1 哈希值来快速执行,进一步节省带宽。
-
服务器端执行: 逻辑在靠近数据的地方执行,避免了数据在客户端与服务器之间来回传输进行判断。
-
-
Redisson 的需求与 Lua 脚本的契合:
-
Redisson 实现了分布式锁、信号量、队列、Map、Set 等复杂的分布式数据结构。
-
这些结构的很多操作(如获取锁、释放锁、向容量受限的队列添加元素)都需要原子地执行一系列命令,并且包含复杂的条件判断(例如:锁是否存在?是我的锁吗?重入次数是多少?队列满了吗?有等待的线程吗?)。
-
使用事务难以实现这些复杂且带条件的原子操作,或者实现起来需要非常多的客户端逻辑和重试机制,性能和健壮性都不理想。
-
使用 Lua 脚本则完美契合了这些需求:可以将获取锁、判断锁状态、设置过期时间、增加重入次数等一系列操作封装在一个 Lua 脚本中,在服务器端原子地执行。释放锁、公平锁的排队机制、信号量的增减等同样可以高效且原子地通过 Lua 脚本实现。
-
总结原因:
Redisson 选择 Lua 脚本而非 Redis 事务,主要是因为 Lua 脚本提供了:
-
更强大的原子性保证:确保复杂的多步操作作为一个单一的、不可分割的命令执行。
-
更灵活的服务器端逻辑处理能力:可以在服务器端根据命令结果进行复杂的条件判断和分支操作。
-
显著降低的网络通信开销:将多步操作打包成一次请求,减少了网络延迟和往返次数。
相关文章:
Redisson中为什么用lua脚本不用事务
一文详解事务和lua脚本的区别 核心问题: 为什么 Redisson 在实现分布式锁、信号量等复杂对象时,倾向于使用 Lua 脚本,而不是 Redis 内建的事务 (MULTI/EXEC)? 结论概览: Lua 脚本为 Redisson 提供了更强的原子性保证、…...
成功解决!!!Ubuntu系统安装包时出现:dpkg: 处理归档XXX时出错
在Ubuntu系统中在安装新的包时,有时会报错连环依赖问题,常见的报错为:下列软件包有未满足的依赖关系:XXX依赖XXX 但是它不会被安装 E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以…...
MySql数据库连接池
C数据库连接池 前言1.MySql API 函数讲解1.1 连接数据库的步骤1.2 MySQL C API1.2.1 初始化连接环境1.2.2 连接mysql服务器1.2.3 执行sql语句1.2.4 获取结果集1.2.5 得到结果集的列数1.2.6 获取表头 -> 列名(字段名)1.2.7 得到结果集中各个字段的长度(字节为单位)1.2.8 遍历…...
C++之fmt库介绍和使用(2)
C之fmt库介绍与使用(2) Author: Once Day Date: 2025年5月19日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...
Python的collections模块:数据结构的百宝箱
Python的collections模块:数据结构的百宝箱 对话实录 小白:处理数据时,Python自带的数据结构不够用,有更强大的工具吗? 专家:那可不能错过collections模块,它提供了许多高效实用的数据结构&am…...
吃透 Golang 基础:数据结构之数组
文章目录 吃透 Golang 基础:数据结构之数组概述初始化访问和赋值小结参考资料 吃透 Golang 基础:数据结构之数组 对于 Golang 当中的顺序数据结构,使用频率最高的当然是切片,因为切片非常的灵活。与之相对比,数组常常会…...
第三个小程序动工:一款结合ai的菜谱小程序
1.环境搭建,与初步运行 安装及使用 | Taro 文档 找到一个合适的文件夹,cmd D:\gitee>pnpm install -g tarojs/cli╭──────────────────────────────────────────╮│ …...
小程序涉及提供提供文本深度合成技术,请补充选择:深度合成-AI问答类目
一、问题描述 最近新项目AI咨询小程序审核上线,按照之前小程序的流程,之前审核,提示审核不通过,审核不通过的原因:小程序涉及提供提供文本深度合成技术 (如: AI问答) 等相关服务,请补充选择:深…...
数据结构测试模拟题(1)
1、约瑟夫问题 #include<bits/stdc.h> using namespace std; const int N25; int e[N],ne[N],head-1,idx1; int n,m; void add_to_head(int x){e[idx]x;ne[idx]head;headidx; } void add(int k,int x){e[idx]x;ne[idx]ne[k];ne[k]idx; } int main(){cin>>n>>…...
Elasticsearch高级面试题汇总及答案
Elasticsearch高级面试题汇总及答案 这套Elasticsearch面试题汇总大全,希望对大家有帮助哈~ 1、什么是Elasticsearch Analyzer? 分析器用于文本分析,它可以是内置分析器也可以是自定义分析器。 2、Elasticsearch 支持哪些配置管理工具? 1、 Ansible 2、 Chef 3、 Pu…...
界面控件DevExpress WinForms v24.2——PDF Viewer功能升级
DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...
Apache Apisix配置ip-restriction插件以限制IP地址访问
介绍 ip-restriction 插件可以通过将 IP 地址列入白名单或黑名单来限制对服务或路由的访问。 支持对单个 IP 地址、多个 IP 地址和类似 10.10.10.0/24 的 CIDR(无类别域间路由)范围的限制。 属性 参数名类型必选项默认值有效值描述whitelistarray[st…...
Maven 项目打包时添加本地 Jar 包
在 Maven 项目开发中,我们经常会遇到需要引入本地 Jar 包的场景,比如使用未发布到中央仓库的第三方库、公司内部自定义工具包,或者处理版本冲突的依赖项。本文将详细介绍如何通过 Maven 命令将本地 Jar 包安装到本地仓库,并在项目…...
JavaScript 性能优化:调优策略与工具使用
引言 在当今的 Web 开发领域,性能优化已不再是锦上添花,而是产品成功的关键因素。据 Google 研究表明,页面加载时间每增加 3 秒,跳出率将提高 32%。而移动端用户如果页面加载超过 3 秒,有 53% 的用户会放弃访问。性能…...
48、c# 中 IList 接⼝与List的区别是什么?
在 C# 中,IList 接口和 List 类在集合操作中扮演不同角色,主要区别体现在定义、功能、灵活性、性能及适用场景等方面。以下是详细对比: 1. 定义与本质 IList 接口 抽象契约:仅定义集合的基本操作(如索引访问、添加、…...
在 Azure OpenAI 上使用 Elastic 优化支出和内容审核
作者:来自 Elastic Muthukumar Paramasivam,Bahubali Shetti 及 Daniela Tzvetkova 我们为 Azure OpenAI 正式发布包添加了更多功能,现在提供内容过滤监控和计费见解的增强! 在之前的博客中,我们展示了如何使用 Elasti…...
Redis学习专题(三)主从复制
目录 引言: 1、搭建一主多从 1) 创建/hspredis目录, 并拷贝redis.conf 到 /hspredis 2) vi /hspredis/redis.conf , 进行如下设置 3) 创建3个文件/hspredis/redis6379.conf 、/hspredis/redis6380.conf 、/hspredis/redis6381.conf 并编辑 4) 启动三台redis服…...
设计模式之备忘录模式
在日常开发中,我们经常会遇到这样的场景:需要保存对象的某个历史状态,以便将来恢复。这种需求最常见的例子就是“撤销操作”。在这种情况下,备忘录模式(Memento Pattern)就派上了用场。 目录 1. 概念 2. 代码实现 3. 总结 1. …...
深度学习-runner.run(data_loaders, cfg.workflow)内部执行过程
文件:~/catkin_ws/SparseDrive/projects/mmdet3d_plugin/apis/mmdet_train.py 完成数据加载器、优化器、运行器实例化后, RUNNERS.register_module() class IterBasedRunner(BaseRunner):"""Iteration-based Runner.This runner train m…...
嵌入式开发学习日志(linux系统编程--文件读写函数)Day24
一、系统编程 标准oi 【输入输出】 stdio.h 头文件 :stdio.h >标准输入输出头文件;/usr/include/stdio.h 二、文件操作 1、关于文件操作的步骤 (1)打开文件; (2)io操作,读写…...
DEBUG:Lombok 失效
DEBUG:Lombok 失效 问题描述 基于 Spring Boot 的项目中,编译时显示找不到 log 属性。查看对应的 class 类,Lombok 正常在编译时生成 log 属性。 同时存在另一个问题,使用Getter注解,但实际使用中该注解并没有生效&…...
Qt 控件发展历程 + 目标(1)
文章目录 声明简述控件的发展历程学习目标QWidget属性 简介:这篇文章只是一个引子,介绍一点与控件相关的但不重要的内容(浏览浏览即可),这一章节最为重要的还是要把之后常用且重要的控件属性和作用给学透,学…...
按键精灵ios/安卓辅助工具高级函数OcrEx文字识别(增强版)脚本开发介绍
函数名称 OcrEx文字识别(增强版) 函数功能 返回指定区域内所有识别到的字符串、左上角坐标、区域宽高、可信度,无需自制字库,识别范围越小,效率越高,结果越准确 注意:安卓版按键APP需在设置…...
零基础入门Selenium自动化测试:自动登录edu邮箱
🌟 Selenium简单概述一下 Selenium 是一个开源的自动化测试工具,主要用于 Web 应用程序的功能测试。它能够模拟用户操作浏览器的行为(如点击按钮、填写表单、导航页面等),应用于前端开发、测试和运维领域。 特点 跨…...
MySQL高频面试八连问(附场景化解析)
文章目录 "为什么订单查询突然变慢了?"——从这个问题开始说起一、索引的生死时速(必考题!)二、事务的"套娃"艺术三、锁机制的相爱相杀四、存储引擎的抉择五、慢查询的破案技巧六、分页的深度优化七、高可用架…...
JVM 性能问题排查实战10连击
🗂️ 目录 前言:理论掌握只是起点,定位能力才是核心全局排查模型:三步法1️⃣Full GC 频繁触发:老年代压力过大2️⃣ OOM 爆炸:元空间泄漏 or 缓存未清理3️⃣ CPU 飙升却不是 GC:线程阻塞或热方…...
零基础深入解析 ngx_http_session_log_module
一、引言 在传统的 HTTP 日志中,每个请求都会被单独记录,这对于短连接、异步加载等场景非常直观;但在一些需要以“会话”为单位分析用户行为的场景下,如视频点播、多资源并行加载、长轮询等,单个请求日志难以准确反映…...
10.17 LangChain v0.3核心机制解析:从工具调用到生产级优化的实战全指南
LangChain v0.3 技术生态与未来发展 关键词:LangChain 工具调用, 聊天模型集成, @tool 装饰器, ToolMessage 管理, 多模态交互 使用聊天模型实现工具调用 LangChain v0.3 通过 工具调用(Tool Calling) 机制,将大模型与外部工具深度结合,形成闭环能力链。本节以 GPT-4、L…...
Android Framework学习七:Handler、Looper、Message
文章目录 简介LooperMessageMessageQueueHandlerFramework学习系列文章 简介 Looper当做一台传送装置,MessageQueue是传送带,传送带上放的是Message,Handler用于发送Message分发与接收处理。 Looper frameworks/base/core/java/android/app…...
分钟级降水预报API:精准预测每一滴雨的智慧科技
引言:天气预报进入"分钟时代" 在数字化生活高度发达的今天,人们对天气预报的精确度要求越来越高。传统的24小时预报或小时级预报已无法满足出行、物流、户外活动等场景的精细化需求。分钟级降水预报API的出现,标志着气象服务正式进…...
民政部等部门针对老人权益保障工作发布指导意见
1 品牌资讯 佛慈制药:将探索开发特医食品等产品 李子园将丰富大健康产品矩阵适应银发族需求 京东健康2025年第一季度收入166.45亿元 宁美浩维获融资,致力提供健康管理方案 2 行业动态 固生堂合作华为,联合推动中医药智慧化转型 怡…...
LinkedList源码分析
1. LinkedList初始化 public class LinkedListTest {public static void main(String[] args) {LinkedList<String> list new LinkedList<String>();// 新增list.add("a");list.add("b");list.add("c");list.add("d");l…...
OpenAI Codex 加入Agent编程工具新阵营
上周五,OpenAI推出了一款名为Codex的新型编程系统,该系统能够通过自然语言命令执行复杂的编程任务。Codex标志着OpenAI正式进军正在形成的代理编程工具新阵营。 从GitHub早期的Copilot到当代的Cursor和Windsurf等工具,大多数AI编程助手都是作…...
AMBA三种总线详解并比较
AMBA三种总线详解并比较 AMBA(Advanced Microcontroller Bus Architecture)是 ARM 公司推出的片上总线标准,旨在为 SoC(片上系统)提供高效、灵活的通信架构。 一、总线详解 1. AHB(Advanced High-perform…...
国产视频转换LT6211UX:HDMI2.0转LVDS/MIPI芯片简介,支持4K60Hz
1. LT6211UX HDMI2.0信号输入 支持HDMI2.0b, HDMI1.4和DVI1.0 支持HDCP2.2和HDCP1.4 数据速率高达6Gbps 自适应接收机均衡 支持4k60Hz 支持的3D格式: 对于HDMI -> LVDS: 直接3D输出 2路2D L/R输出 对于HDMI -> MIPI: 框架包装&#x…...
在nextjs项目当中使用wagmi连接MetaMask SDK
Wagmi 是一个为以太坊和 EVM 兼容链构建的 React Hooks 库,专为简化 Web3 应用开发而设计。它提供了一组强大且类型安全的工具,使开发者能够更方便地与钱包(如 MetaMask、WalletConnect 等)和智能合约进行交互。 Wagmi 的全称其实并不是一个传统意义上的缩写,它源自加密社…...
SAP-ABAP:SAP的`TRY...CATCH` 异常处理机制详解
一、异常处理架构与核心机制 1. 异常分类与层次结构 异常类型触发机制处理要求典型子类CX_STATIC_CHECK编译器强制检查(必须声明或捕获)必须显式处理CX_SY_ZERODIVIDE(除零错误)CX_DYNAMIC_CHECK运行时检查(若未处理则触发运行时错误RESUMABLE_FAILURE)推荐显式处理CX_S…...
HarmonyOS NEXT~鸿蒙系统与Uniapp跨平台开发实践指南
HarmonyOS NEXT~鸿蒙系统与Uniapp跨平台开发实践指南 引言:鸿蒙与Uniapp的融合价值 华为鸿蒙系统(HarmonyOS)作为新一代智能终端操作系统,其分布式能力与跨设备协同特性为开发者带来了全新机遇。而Uniapp作为流行的跨平台应用开发框架&…...
python 提交命令 到远程windows中
在Python中,你可以使用多种方式来提交命令到远程Windows机器上。最常见的方法是通过SSH协议(使用paramiko库)或者通过Windows远程管理工具如WinRM(使用python-winrm库)。 使用Paramiko进行SSH连接 Paramiko是一个Pyth…...
【520 特辑】用 HTML/CSS/JavaScript 打造浪漫炫酷的表白网页
一、前言 在 520 这个充满爱意的日子里,程序员该如何用代码表达浪漫?本文将分享一个结合动画特效与交互设计的 520 表白网页案例,通过 HTML/CSS/JavaScript 实现动态爱心、渐变背景、浮动文字等炫酷效果,手把手教你用技术传递心意…...
【QT】QTableWidget获取width为100,与真实值不符问题解决
背景 用stackedWidget内嵌2个QTableWidget页面,实现切换。在进行stackedWidget.width()的获取时候,可以正常获得ui界面设置的宽度值,但是在QTableWidget页面用同样的方式无法成功获取真实值,即使采用获取内容区域宽度(…...
Hive drop column 的解决方法
示例: 创建 text 格式的表 create table t1(c1 int, c2 int) stored as textfile;增加一个字段 alter table t1 add columns (c3 int);使用 replace columns 删除新加的字段 alter table t1 replace columns (c1 int, c2 int);对于 ORC 类型的表,使用…...
Python虚拟环境再PyCharm中自由切换使用方法
Python开发中的环境隔离是必不可少的步骤,通过使用虚拟环境可以有效地管理不同项目间的依赖,避免包冲突和环境污染。虚拟环境是Python官方提供的一种独立运行环境,每个项目可以拥有自己单独的环境,不同项目之间的环境互不影响。在日常开发中,结合PyCharm这样强大的IDE进行…...
Spark大数据分析案例(pycharm)
所需文件(将文件放在路径下,自己记住后面要用): 通过百度网盘分享的文件:beauty_p....csv等4个文件 链接:https://pan.baidu.com/s/1pBAus1yRgefveOc7NXRD-g?pwd22dj 提取码:22dj 复制这段内…...
【QT】ModbusTCP读写寄存器类封装
背景 在编写ModbusTCP时候,连接、寄存器读写属于通用的功能,为了便于后续直接复用,选择封装到一个类。本博文在封装展示该类过程中,会提及到编写该类过程中,出现的连接未成功的问题,以及该问题的解决方式。…...
SQLMesh 内置宏详解:@PIVOT等常用宏的核心用法与示例
本文系统解析 SQLMesh 的四个核心内置宏,涵盖行列转换的 PIVOT、精准去重的 DEDUPLICATE、灵活生成日期范围的 DATE_SPINE,以及动态表路径解析的 RESOLVE_TEMPLATE。通过真实案例演示参数配置与 SQL 渲染逻辑,并对比宏调用与传统 SQL 的差异&…...
ajax post请求 解决自动再get请求一次
ajax post请求 解决自动再get请求一次 HTMLjavascriptFlask第一种方法:第二种方法: HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title></head> &l…...
当前主流的传输技术(如OTN、IP-RAN、FlexE等)
好的!当前主流的传输技术(如OTN、IP-RAN、FlexE等)各有其独特的应用场景,下面我会逐一展开讲解,并结合实际案例说明它们如何在不同领域发挥作用。 一、OTN(光传送网) 1. 核心特点 大容量&…...
利用 SQL Server 作业实现异步任务处理,简化系统架构
在现代企业系统中,异步任务是不可或缺的组成部分,例如: 电商系统中的订单超时取消; 报表系统中的异步数据导出; CRM 系统中的客户积分计算。 传统的实现方式通常涉及引入消息队列(如 RabbitMQ、Kafka&a…...
【Java高阶面经】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战
一、熔断抖动的本质剖析与核心成因 1.1 熔断机制的核心价值与抖动危害 熔断机制作为微服务弹性架构的核心组件,通过模拟电路断路器逻辑,在服务出现异常时自动阻断请求链,防止故障扩散引发雪崩。但频繁的“熔断-恢复-熔断”抖动会导致: 用户体验恶化:请求成功率波动大,响…...