Redis(2):Redis + Lua为什么可以实现原子性
Redis 作为一款高性能的键值对存储数据库,与 Lua 脚本相结合,为实现原子性操作提供了强大的解决方案,本文将深入探讨 Redis + Lua 实现原子性的相关知识
原子性概念的厘清
在探讨 Redis + Lua 的原子性之前,我们需要明确原子性的概念。通常我们提及的原子性,多是指关系型数据库(如 MySQL)ACID 特性中的 Atomicity(原子性)。在 ACID 语境下,原子性要求事务中的所有操作要么全部成功执行,要么全部失败回滚。
以常见的银行转账为例,当账户 A 向账户 B 转账 100 元时,原子性确保账户 A 减去 100 元的同时,账户 B 必须增加 100 元。若账户 A 减少了 100 元,但账户 B 未增加 100 元,该操作就不具备原子性,需要回滚,将账户 A 减少的 100 元加回去。这一概念是我们理解数据操作完整性的基础。
Lua 原子性在 Redis 中的体现
Lua 本身只是一种脚本语言,它并未直接提供原子性支持,通常被嵌入到像 Redis 这样的宿主程序中运行。在 Redis 环境里,执行 Lua 脚本的原子性意味着整个 Lua 脚本在执行期间,不会被其他客户端的命令打断。这就保证了在执行 Lua 脚本时,Redis 会将其视为一个不可分割的整体来处理,不会受到其他并发操作的干扰。
Redis 的事务机制
Redis 的事务由 MULTI/EXEC 两个核心命令完成,同时 WATCH/DISCARD 两个命令为其增添了 CAS(Compare - And - Swap)乐观锁机制。不过需要注意的是,Redis 的事务与关系型数据库(如 MySQL)遵循的 ACID 事务不同,它并不支持回滚。
Redis 执行 Lua 的方式
Redis 通过原生命令(如 EVAL/EVALSHA 命令)来执行 Lua 脚本。在编写 Lua 脚本时,开发者需要特别留意 redis.call () 和 redis.pcall () 这两个命令的区别。
- redis.call():用于执行 Redis 的命令。一旦命令执行出错,它会阻断整个脚本的执行,并将错误信息返回给客户端。这种特性适合在需要严格保证命令执行成功的场景中使用,若某个关键命令失败,整个脚本不应继续执行。
- redis.pcall():同样用于执行 Redis 的命令,但当命令执行出错时,它不会阻断脚本的执行,而是在内部捕获错误,并继续执行后续的命令。这种方式适用于一些对部分命令失败有一定容忍度,希望脚本尽可能完整执行的场景。
Redis 部署方式对事务结果的影响
Redis 的部署方式在一定程度上影响着 Lua 脚本执行的原子性结果。
- 单机部署:无论 Lua 脚本中操作的 key 是否为同一个,单机部署的 Redis 都能保证原子性。因为在单机环境下,所有操作都是在同一个进程中顺序执行,不存在并发干扰的问题。
- 主从部署:Redis 的主从复制旨在将主节点的数据同步到从节点,以维持数据一致性。由于所有写操作都在主节点进行,所以无论 Lua 脚本操作的 key 是否相同,都能保证原子性。主节点按顺序执行 Lua 脚本,从节点则通过复制机制保持数据同步。
- Cluster 部署:情况相对复杂。如果 Lua 脚本操作的是同一个 key,能保证原子性;但如果操作的 key 不同,这些 key 可能被 hash 到不同的 slot,也可能 hash 到相同的 slot,因此不一定能保证原子性。所以,在 Cluster 集群部署环境下使用 Lua 脚本时,务必确保 Lua 脚本操作的是同一个 key,以保障原子性。
为何选择用 Lua 实现原子性
在 Redis 事务中,事务队列中的所有命令需在 EXEC 命令执行时才会被执行。这就导致对于多个命令之间存在依赖关系(如后面的命令需要依赖上一个命令结果)的场景,Redis 事务显得力不从心。
Lua 脚本由于其能够顺序执行一系列命令,并且在执行过程中不会被其他客户端命令打断,更适合处理这种复杂场景,从而弥补了 Redis 事务的不足。
需要重点关注的是,ACID 中的原子性强调命令要么全部执行,要么全部不执行;而 Redis 执行 Lua 脚本的原子性是指 Lua 脚本会当作一个整体被执行且不被其他事务打断,但 Lua 脚本里面的命令并不能保证 “要么全部执行,要么全部不执行”。
通过深入了解 Redis + Lua 实现原子性的原理、Redis 的事务机制以及不同部署方式的影响,可以更加精准地运用这一技术,为分布式系统开发提供坚实的数据操作保障。
相关文章:
Redis(2):Redis + Lua为什么可以实现原子性
Redis 作为一款高性能的键值对存储数据库,与 Lua 脚本相结合,为实现原子性操作提供了强大的解决方案,本文将深入探讨 Redis Lua 实现原子性的相关知识 原子性概念的厘清 在探讨 Redis Lua 的原子性之前,我们需要明确原子性的概念…...

PyTorch LSTM练习案例:股票成交量趋势预测
文章目录 案例介绍源码地址代码实现导入相关库数据获取和处理搭建LSTM模型训练模型测试模型绘制折线图主函数 绘制结果 案例介绍 本例使用长短期记忆网络模型对上海证券交易所工商银行的股票成交量做一个趋势预测,这样可以更好地掌握股票买卖点,从而提高…...

CK3588下安装linuxdeployqt qt6 arm64
参考资料: Linux —— linuxdeployqt源码编译与打包(含出错解决) linux cp指令报错:cp: -r not specified; cp: omitting directory ‘xxx‘(需要加-r递归拷贝) CMake Error at /usr/lib/x86_64…...

木马查杀引擎—关键流程图
记录下近日研究的木马查杀引擎,将关键的实现流程图画下来 PHP AST通道实现 木马查杀调用逻辑 模型训练流程...

二程运输的干散货船路径优化
在二程运输中,干散货船需要将货物从一个港口运输到多个不同的目的地港口。路径优化的目标是在满足货物运输需求、船舶航行限制等条件下,确定船舶的最佳航行路线,以最小化运输成本、运输时间或其他相关的优化目标。 影响因素 港口布局与距离:各个港口之间的地理位置和距离…...

华为数字政府与数字城市售前高级专家认证介绍
华为数字政府与数字城市售前高级专家认证面向华为合作伙伴售前高级解决方案专家、华为数字政府与数字城市行业解决方案经理(VSE)。 通过认证验证的能力 您将了解数字政府、数字城市行业基础知识,了解该领域内的重点场景;将对华…...
在VSCode中接入DeepSeek的指南
本文将介绍三种主流接入方式,涵盖本地模型调用和云端API接入方案。 一、环境准备 1.1 基础要求 VSCode 1.80+Node.js 16.x+Python 3.8+(本地部署场景)已部署的DeepSeek服务(本地或云端)1.2 安装必备插件 # 打开VSCode插件面板(Ctrl+Shift+X) 搜索并安装: - DeepSeek Of…...

【docker】--容器管理
文章目录 容器重启--restart 参数选项及作用**对比 always 和 unless-stopped****如何查看容器的重启策略?** 容器重启 –restart 参数选项及作用 重启策略 no:不重启(默认)。on-failure:失败时重启(可限…...

基于OpenCV的人脸微笑检测实现
文章目录 引言一、技术原理二、代码实现2.1 关键代码解析2.1.1 模型加载2.1.2 图像翻转2.1.3 人脸检测 微笑检测 2.2 显示效果 三、参数调优建议四、总结 引言 在计算机视觉领域,人脸检测和表情识别一直是热门的研究方向。今天我将分享一个使用Python和OpenCV实现…...
使用PEFT库将原始模型与LoRA权重合并
使用PEFT库将原始模型与LoRA权重合并 步骤如下: 基础模型加载:需保持与LoRA训练时相同的模型配置merge_and_unload():该方法会执行权重合并并移除LoRA层保存格式:合并后的模型保存为标准HuggingFace格式,可直接用于推…...

2025-5-15Vue3快速上手
1、setup和选项式API之间的关系 (1)vue2中的data,methods可以与vue3的setup共存 (2)vue2中的data可以用this读取setup中的数据,但是反过来不行,因为setup中的this是undefined (3)不建议vue2和vue3的语法混用…...

【金仓数据库征文】从生产车间到数据中枢:金仓数据库助力MES系统国产化升级之路
目录 前言一、金仓数据库:国产数据库的中坚力量二、制造业MES系统:数据驱动的生产智能MES系统的核心价值MES系统关键模块与数据库的关系1. BOM管理2. 生产工单与订单管理3. 生产排产与资源调度4. 生产报工与实时数据采集 5. 采购与销售管理 三、从MySQL到…...

HTML17:表单初级验证
表单初级验证 常用方式 placeholder 提示信息 <p>名字:<input type"text" name"username" maxlength"8" size"30" placeholder"请输入用户名"></p>required 非空判断 <p>名字:<input type"…...

从卡顿到丝滑:JavaScript性能优化实战秘籍
引言 在当今的 Web 开发领域,JavaScript 作为前端开发的核心语言,其性能表现对网页的加载速度、交互响应以及用户体验有着举足轻重的影响。随着 Web 应用的复杂度不断攀升,功能日益丰富,用户对于网页性能的期望也越来越高。从电商…...
How Sam‘s Club nudge customers into buying more
Here’s how Sam’s Club (or similar warehouse memberships) nudge customers into buying more: It’s a classic psychological strategy rooted in sunk cost fallacy and loss aversion. 1. Prepaid Membership Creates a “Sunk Cost” Once you’ve paid the annual …...

ORB特征点检测算法
角点是图像中灰度变化在两个方向上都比较剧烈的点。与边缘(只有一个方向变化剧烈)或平坦区域(灰度变化很小)不同,角点具有方向性和稳定性。 tips:像素梯度计算 ORB算法流程简述 1.关键点检测(使用FAST…...

快速通关单链表秘籍
1.单链表概念与结构 1.1 概念 链表是一种逻辑结构连续,物理结构不连续的存储结构,数据结构的逻辑顺序是通过链表中的指针链接次序实现。 光看定义有点不好理解,我们举个简单例子! 我们都看过火车吧,我们看到的火车…...

springboot+vue实现在线书店(图书商城)系统
今天教大家如何设计一个图书商城 , 基于目前主流的技术:前端vue,后端springboot。 同时还带来的项目的部署教程。 视频演示 在线书城 图片演示 一. 系统概述 商城是一款比较庞大的系统,需要有商品中心,库存中心,订单…...
C++二项式定理:原理、实现与应用
背景 鉴于复习,问了问清言二项式定理的应用…只好多找些资源…肝要死了… 一、引言 二项式定理是数学中一个基本定理,主要用于展开二项式的幂次。在C编程中,理解并实现二项式定理及其拓展具有重要意义,可以解决组合数学、概率论…...
使用GmSSL v3.1.1实现SM2证书认证
1、首先使用gmssl命令生成根证书、客户端公私钥,然后使用根证书签发客户端证书; 2、然后编写代码完成认证功能,使用根证书验证客户端证书是否由自己签发,然后使用客户端证书验证客户端私钥对随机数的签名是否正确。 第一部分生成根…...
远程实时控制安卓模拟器技术scrcpy
先运行模拟器 ~/Library/Android/sdk/emulator/emulator -avd Medium_Phone_API_25 再检查adb device /Users/xmkjsoft/Downloads/scrcpy-macos-x86_64-v3.2/adb devices 再开始实时获取模拟器画面 /Users/xmkjsoft/Downloads/scrcpy-macos-x86_64-v3.2/scrcpy --video-cod…...

Spring AI(6)——向量存储
向量数据库是一种特殊类型的数据库,在 AI 应用中发挥着至关重要的作用。 在向量数据库中,查询与传统关系型数据库不同。它们执行的是相似性搜索,而非精确匹配。当给定一个向量作为查询时,向量数据库会返回与该查询向量“相似”的…...
Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解
Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解 前言一、引入依赖二、配置 Elasticsearch三、创建模型类(Entity)四、使用 ElasticsearchOperations 进行 CRUD 操作1. 保存数据(Create)2. 获取数据&am…...
react-router基本写法
1. 创建项目并安装所有依赖 npx create-react-app react-router-pro npm i 2. 安装所有的 react router 包 npm i react-router-dom 3. 启动项目 npm run start router/index.js // 创建路由实例 绑定path elementimport Layout from "/pages/Layout"; import…...

【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!
文章目录 一、软件安装1.1 系统配置要求1.2 安装 二、新版功能探索2.1 界面图标和深色主题2.2 MATLAB Copilot AI助手2.3 绘图区升级2.4 simulink2.5 更多 延迟一个月,终于发布了🤭。 一、软件安装 1.1 系统配置要求 现在的电脑都没问题,老…...
智能语音助手的未来:从交互到融合
摘要 随着人工智能技术的不断进步,智能语音助手已经成为我们生活中不可或缺的一部分。从简单的语音指令到复杂的多模态交互,语音助手正在经历一场深刻的变革。本文将探讨智能语音助手的发展历程、当前的技术瓶颈以及未来的发展方向,特别是其在…...

uniapp,小程序中实现文本“展开/收起“功能的最佳实践
文章目录 示例需求分析实现思路代码实现1. HTML结构2. 数据管理3. 展开/收起逻辑4. CSS样式 优化技巧1. 性能优化2. 防止事件冒泡3. 列表更新处理 实际效果总结 在移动端应用开发中,文本内容的"展开/收起"功能是提升用户体验的常见设计。当列表项中包含大…...

思维链框架:LLMChain,OpenAI,PromptTemplate
什么是思维链,怎么实现 目录 什么是思维链,怎么实现思维链(Chain of Thought)在代码中的实现方式1. 手动构建思维链提示2. 少样本思维链提示3. 自动思维链生成4. 思维链与工具使用结合5. 使用现有思维链框架:LLMChain,OpenAI,PromptTemplate思维链实现的关键要点思维链(C…...
HOT100 (哈希双指针)
哈希 1.两数之和(unordered_map) 给定一个整数数组 nums 和一个整数目标值 target,返回满足条件的数组下标 思路:用umap,一边遍历,一边装; class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> u…...

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)
使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据 目录 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据📌 简介🛠 插件安装方法🌍 下载 DEM 数据步骤🔑 注册 OpenTopography 账号(如使用 Cope…...