当前位置: 首页 > article >正文

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

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

一、为什么需要Lua脚本?

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

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

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.kler.cn/a/558960.html

相关文章:

  • 如何让大模型理解变量,扣子(coze)智能体中变量描述起着啥作用?程序员看了集体惊呆!扣子免费系列教程(19)
  • 梯度计算(MATLAB和pytorch实例)
  • Github 2025-02-21 Java开源项目日报Top7
  • Unity制作游戏——前期准备:Unity2023和VS2022下载和安装配置——附安装包
  • netty十八罗汉之——挖耳罗汉(Decoder)
  • 一文弄懂RSA算法中的TLS握手流程
  • 大白话“讲”哈希表
  • 数据结构与算法-搜索-双向搜索 和 A*算法(字串变换,八数码,第k短路)
  • 【Vue3+Tres 三维开发】03 - 基本操作
  • 习题解答 | 一维差分与等差数列差分
  • 如何通过 Docker 在没有域名的情况下快速上线客服系统
  • Unity for Python —— 强大的 Python 脚本支持提升 Unity 编辑器效率
  • C语言递归——青蛙跳台阶问题和汉诺塔问题
  • 辗转相除法(欧几里得算法)
  • transformer架构嵌入层位置编码之RoPE旋转位置编码及简单实现示例
  • go-zero学习笔记(五)
  • Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法
  • 嵌入式之内存管理
  • 【2025.2最新版】从零开始的HTML网页开发学习笔记(包含网页基础概念 HTML语法 前端工具VsCode介绍)
  • mysql之B+ 树索引 (InnoDB 存储引擎)机制