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 数组,KEYS[1]表示第一个key,KEYS[2]表示第2个key,依次类推。

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

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 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。

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

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

相关推荐
Think Spatial 空间思维32 分钟前
【HTTPS基础概念与原理】TLS握手过程详解
数据库·网络协议·https
laowangpython1 小时前
MySQL基础面试通关秘籍(附高频考点解析)
数据库·mysql·其他·面试
mooyuan天天1 小时前
SQL注入报错“Illegal mix of collations for operation ‘UNION‘”解决办法
数据库·web安全·sql注入·dvwa靶场·sql报错
运维-大白同学1 小时前
go-数据库基本操作
开发语言·数据库·golang
R-sz2 小时前
通过从数据库加载MinIO配置并初始化MinioClient,spring boot之Minio上传
数据库·oracle
洛阳泰山2 小时前
Windows系统部署MongoDB数据库图文教程
数据库·windows·mongodb
医只鸡腿子2 小时前
3.2/Q2,Charls最新文章解读
数据库·数据挖掘·数据分析·深度优先·数据库开发
炫酷的伊莉娜2 小时前
【Redis】零碎知识点(易忘 / 易错)总结回顾
redis
bang___bang_3 小时前
PostgreSQL内幕剖析——结构与架构
数据库·postgresql
龙俊亨3 小时前
达梦数据库查看各数据库表内容
数据库