1.大坑1—返回值类型问题
这样返回Long是正常的,但是如果返回值类型定义Integer就会报错
Redis exception; nested exception is io.lettuce.core.RedisException: java.lang.IllegalStateException
/** * 初始lua脚本 */ 正确
private final static DefaultRedisScript<Long> VOTE_SCRIPT;
static {
// 投票脚本
VOTE_SCRIPT = new DefaultRedisScript<>();
VOTE_SCRIPT.setLocation(new ClassPathResource("lua/activity/vote.lua"));
VOTE_SCRIPT.setResultType(Long.class);
}
-------------------------------------------------------------------------------------------
/** * 初始lua脚本 */ 错误
private final static DefaultRedisScript<Integer> VOTE_SCRIPT;
static {
// 投票脚本
VOTE_SCRIPT = new DefaultRedisScript<>();
VOTE_SCRIPT.setLocation(new ClassPathResource("lua/activity/vote.lua"));
VOTE_SCRIPT.setResultType(Integer.class);
}
原因:个人认为Redis 返回的整数会被解析为 Long 类型
2.大坑2—使用lua库问题(比如Redis lua脚本使用cjson)
因为redis lua解释器自带了
base lib.
table lib.
string lib.
math lib.
debug lib.
struct lib.
cjson lib.
cmsgpack lib.
bitop lib. 等库
所以在idea 编译lua脚本 Redis使用的是自带的,不是我们本地电脑或服务器自带的lua配置
所以使用Redis执行lua脚本直接用库调用方法就行了 比 cjson.decode(json)
使用Reids调用lua脚本不需要引入cjson模块
java代码
// javaRedis客户端执行lua脚本
redisTemplate.execute()
lua代码
-- 这里一定不要手动引入cjson 因为Redis自带 引入会报错
-- local cjson = require("cjson") 不要引入
-- 直接用 cjson 调用方法就行了
-- 比如
-- 获取json缓存
local json = redis.call("GET", key)
-- 使用 cjson 库解析 JSON
local votePlayer = cjson.decode(playerJson)
如果是用本地配置执行lua 使用cjson则需要引入cjson
好了就到这里,如果用什么不懂的可以留言评论或者私信