Redis使用lua脚本

lua脚本

一种轻量级的脚本语言

Redis+lua

通过在redis中使用lua脚本可以实现复杂的操作

lua脚本在redis中的执行是原子性的

lua脚本

lua 复制代码
local ret = redis.call('hset', KEYS[1], ARGV[1], ARGV[2], ARGV[3], ARGV[4]);
redis.call('incr', KEYS[2]);
return ret..'';

KEYS:表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,KEYS1表示第一个key,KEYS2表示第2个key,依次类推。

ARGV:表示在脚本中所用到的参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV1 、 ARGV2 ,诸如此类),ARGV1表示第一个参数,ARGV2表示第二个参数,依次类推。

redis执行lua脚本

使用EVAL命令执行lua脚本

eval 保证了redis的命令本身具有原子性并且整个脚本的执行具有原子性

lua 复制代码
EVAL script numkeys key [key ...] arg [arg ...] 

script**: 是一段 Lua 5.1 脚本程序。**

numkeys: 用于指定键名参数的个数。

key key ...: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS1 , KEYS2 ,以此类推)。

arg arg ...: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV1 、 ARGV2 ,诸如此类)。

Java项目集成lua脚本

使用redisTemplate.execute()方法

java 复制代码
<T> T execute(RedisScript<T> script, List<K> keys, Object... args)

使用RedisScript的实现类DefaultRedisScript

将lua脚本的内容传入对象并指定返回值类型

java 复制代码
public DefaultRedisScript(String script, @Nullable Class<T> resultType) {
    this.shaModifiedMonitor = new Object();
    this.setScriptText(script);
    this.resultType = resultType;
}

或者直接指定lua脚本的位置

java 复制代码
public void setScriptSource(ScriptSource scriptSource) {
    this.scriptSource = scriptSource;
}

@Bean("Lua_test01")
public DefaultRedisScript<Integer> getLuaTest01() {
    DefaultRedisScript<Integer> redisScript = new DefaultRedisScript<>();
    //resource目录下的scripts文件下的Lua_test01.Lua文件
    redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("scripts/Lua_test01.Lua")));
    redisScript.setResultType(Integer.class);
    return redisScript;
}

lua脚本的注意事项

在redis集群中执行lua脚本必须保证多个key落在同一个节点下(通过{}+分片集群保证),否则会报错

相关推荐
用户3169353811832 天前
Java连接Redis
redis
倔强的石头_2 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence3 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神4 天前
三、用户与权限管理
数据库·mysql
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
麦聪聊数据4 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
xingpanvip4 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
DARLING Zero two♡4 天前
【MySQL数据库】数据类型与表约束
数据库·mysql