SpringBoot通过RedisTemplate执行Lua脚本

本文详细介绍了如何在SpringBoot中使用RedisScript执行Lua脚本,包括配置DefaultRedisScript,解决不同版本SpringBoot的兼容性问题,以及如何调用Lua脚本执行特定任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你对Redis和Lua的关系不太清楚,请先阅读:Redis进阶之使用Lua脚本开发

1.RedisScript

首先你得引入spring-boot-starter-data-redis依赖,其次把lua脚本放在resources目录下。

@Bean
public DefaultRedisScript<List> defaultRedisScript() {
    DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<>();
    defaultRedisScript.setResultType(List.class);
//   defaultRedisScript.setScriptText("");
    defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis/demo.lua")));
    return defaultRedisScript;
}

在Spring Boot2.0的时候,上述配置没有问题,但在Spring Boot1.5测试会出错,需要将List.class改为具体的返回类型(如Long.class)。

RedisScript的getSha1()方法可以获取脚本摘要。

2.调用脚本

/**
* List设置lua的KEYS
*/
List<String> keyList = new ArrayList();
keyList.add("count");
keyList.add("rate.limiting:127.0.0.1");

/**
* 用Mpa设置Lua的ARGV[1]
*/
Map<String, Object> argvMap = new HashMap<String, Object>();
argvMap.put("expire", 10000);
argvMap.put("times", 10);

/**
* 调用脚本并执行
*/
List result = redisTemplate1.execute(redisScript, keyList, argvMap);
System.out.println(result);

若是出现序列化问题,可以指定序列化方式。

public <T> T execute(RedisScript<T> script, RedisSerializer<?> argsSerializer, RedisSerializer<T> resultSerializer,
        List<K> keys, Object... args) {
    return scriptExecutor.execute(script, argsSerializer, resultSerializer, keys, args);
}

3.Lua脚本

--获取KEY
local key1 = KEYS[1]
local key2 = KEYS[2]
 
-- 获取ARGV[1],这里对应到应用端是一个List<Map>.
--  注意,这里接收到是的字符串,所以需要用csjon库解码成table类型
local receive_arg_json =  cjson.decode(ARGV[1])
 
--获取ARGV内的参数并打印
local expire = receive_arg_json.expire
local times = receive_arg_json.times

参考:https://blog.youkuaiyun.com/fsw4848438/article/details/81540495

转载于:https://www.cnblogs.com/yueshutong/p/10786163.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值