Spring Boot集成Redis + Lua脚本实现原子性操作:小白入门指南

news/2025/2/24 5:38:11

Spring Boot集成Redis + Lua脚本实现原子性操作:小白入门指南

一、为什么需要Lua脚本?

在分布式系统中,多个Redis命令的组合操作(如先查询后修改)可能因网络延迟、并发竞争导致数据不一致。Lua脚本可以将多个命令封装为一个原子操作,确保所有命令要么全部成功,要么全部失败,避免中间状态
优势

  • 原子性:Redis单线程执行Lua脚本,执行期间不会被其他操作打断
  • 减少网络开销:多个命令合并为一次请求

rediscall__redispcall__14">2. Lua脚本中 redis.callredis.pcall 的区别

  • redis.call:在执行 Redis 命令时,如果发生错误会抛出异常并终止脚本执行。
  • redis.pcall:在执行 Redis 命令时,即使发生错误也不会抛出异常,而是返回一个包含错误信息的表,脚本会继续执行

3. 在不同数据类型中的应用

1. String 类型
操作Lua 脚本示例参数说明返回值
设置值redis.call('SET', KEYS[1], ARGV[1])KEYS[1]: key“OK”
获取值redis.call('GET', KEYS[1])KEYS[1]: keyString 或 nil(不存在时)
自增redis.call('INCR', KEYS[1])KEYS[1]: key新整数(若 key 不存在则初始化为 1)
带过期时间设置redis.call('SETEX', KEYS[1], ARGV[1], ARGV[2])ARGV[1]: 秒,ARGV[2]: 值“OK”
2. Hash 类型
操作Lua 脚本示例参数说明返回值
设置字段值redis.call('HSET', KEYS[1], ARGV[1], ARGV[2])ARGV[1]: 字段名1(新增)或 0(更新)
获取字段值redis.call('HGET', KEYS[1], ARGV[1])ARGV[1]: 字段名String 或 nil
获取所有字段redis.call('HGETALL', KEYS[1])KEYS[1]: keyTable(交替字段名和值)
删除字段redis.call('HDEL', KEYS[1], ARGV[1])ARGV[1]: 字段名删除的字段数量
3. List 类型
操作Lua 脚本示例参数说明返回值
左/右插入元素redis.call('LPUSH', KEYS[1], ARGV[1])ARGV[1]: 元素值列表长度
获取范围元素redis.call('LRANGE', KEYS[1], ARGV[1], ARGV[2])ARGV[1]: 起始索引(0-based)Table(元素列表)
弹出元素redis.call('LPOP', KEYS[1])-元素值或 nil(空列表时)
4. Set 类型
操作Lua 脚本示例参数说明返回值
添加元素redis.call('SADD', KEYS[1], ARGV[1])ARGV[1]: 元素值新增元素数量
判断元素存在redis.call('SISMEMBER', KEYS[1], ARGV[1])ARGV[1]: 元素值1(存在)或 0(不存在)
获取所有元素redis.call('SMEMBERS', KEYS[1])KEYS[1]: keyTable(无序元素列表)
5. ZSet(有序集合)
操作Lua 脚本示例参数说明返回值
添加带分数元素redis.call('ZADD', KEYS[1], ARGV[1], ARGV[2])ARGV[1]: 分数,ARGV[2]: 元素新增元素数量
获取分数范围元素redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[2])ARGV[1]: 最小分数,ARGV[2]: 最大分数Table(元素列表)
获取排名redis.call('ZRANK', KEYS[1], ARGV[1])ARGV[1]: 元素值排名(从 0 开始)或 nil
6. 通用操作
操作Lua 脚本示例参数说明返回值
判断 Key 是否存在redis.call('EXISTS', KEYS[1])KEYS[1]: key1(存在)或 0(不存在)
设置过期时间redis.call('EXPIRE', KEYS[1], ARGV[1])ARGV[1]: 秒数1(成功)或 0(Key 不存在)
删除 Keyredis.call('DEL', KEYS[1])KEYS[1]: key删除的 Key 数量

http://www.niftyadmin.cn/n/5863989.html

相关文章

《深入探索Vben框架:使用经验与心得分享》

文章目录 摘要引言一、Vben框架概述二、Vben框架的安装与配置三、Vben框架的核心功能解析1. 路由管理2. 状态管理3. 组件库4. API请求处理 四、Vben框架的高级特性1. 动态表单2. 权限控制3. 国际化支持 五、Vben框架的最佳实践1. 代码组织与模块化2. 性能优化3. 错误处理与调试…

vue:vite 代理服务器 proxy 配置

Vite 代理服务器(Proxy)的配置通常用于开发环境,以解决跨域请求等问题。以下是一个详细的配置步骤: 通过以上步骤,你就可以在 Vite 项目中配置代理服务器,以便在开发过程中方便地访问后端服务。 ‌找到 Vi…

单链表:数据结构中的灵活“链条”

目录 🚀前言🤔单链表是什么?💯单链表的结构特点💯单链表的用途 ✍️单链表的实现与接口解释💯打印链表💯尾插操作💯头插操作💯头删操作💯尾删操作&#x1f4a…

Spring Boot 概要(官网文档解读)

Spring Boot 概述 Spring Boot 是一个高效构建 Spring 生产级应用的脚手架工具,它简化了基于 Spring 框架的开发过程。 Spring Boot 也是一个“构件组装门户”,何为构件组装门户呢?所谓的“构件组装门户”指的是一个对外提供的Web平台&#x…

MongoDB#数据删除优化

分批删除 const batchSize 10000; // 每批删除 10,000 条数据 let deletedCount 0; do {const result db.xxx_collection.deleteMany({createTime: { $lt: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000) }}, { limit: batchSize });deletedCount result.deletedCount;p…

智能测试执行 利用算法 利用图像识别、自然语言处理等技术实现自动化测试执行

以下将从Web应用和移动应用两个方面,给出利用图像识别、自然语言处理等技术实现自动化测试执行的实例,并附上部分代码示例。 Web应用自动化测试实例:模拟用户登录操作测试 需求理解 对于一个Web应用的登录功能进行自动化测试,我们可以结合自然语言处理理解测试用例描述,…

C++ 标准库——函数对象和函数适配器

文章目录 函数对象函数适配器bindbind的重载问题bind的引用问题 mem_fnfunction C标准库提供了函数对象和函数适配器功能 函数对象 许多标准库算法都接受函数对象(或函数)参数,用来控制其工作方式。常见的函数对象包括——比较标准、谓词&am…

C#实现Modbus TCP 通讯测试软件

C#实现Modbus TCP 通讯测试软件,源码,包括读写功能。 文件列表 WindowsFormsApplication6/WindowsFormsApplication6.sln , 1041 WindowsFormsApplication6/WindowsFormsApplication6.v12.suo , 39936 WindowsFormsApplication6/WindowsFormsApplicati…