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落在同一个节点下(通过{}+分片集群保证),否则会报错

相关推荐
JosieBook3 分钟前
【数据库】时序数据库通过国测认证,TimechoAI开放体验:工业数据的“存”与“智”如何协同?
数据库·时序数据库
卓怡学长24 分钟前
w263基于springboot + vue 健康饮食管理系统
java·数据库·vue.js·spring boot·spring·intellij-idea
阿演2 小时前
DataDjinn v0.2.11:SQL 编辑、AI 协作和表格操作继续打磨
数据库·人工智能·sql
yh弓长3 小时前
Redis的list类及基础指令
redis·list
智脑API平台4 小时前
Codex 国内使用会封号吗?账号安全、中转站和合规边界说明
数据库·redis·缓存
l1t4 小时前
duckdb 1.6dev新增的.manual命令
开发语言·数据库
辉灰笔记4 小时前
第一篇:MySQL8.0生产备份实战|XtraBackup全自动全量+增量备份(钉钉告警+异地Binlog归档)
数据库·mysql·钉钉·运维开发
山峰哥4 小时前
‌Explain实战:打开数据库执行计划的黑盒‌
大数据·服务器·数据库·sql·深度优先·宽度优先
迷途呀5 小时前
新闻头条后端:新闻缓存模块
前端·redis·python·缓存·fastapi
ClickHouseDB5 小时前
ClickHouse 26.6 版本发布说明
数据库