Redis Lua脚本问题大坑问题

文章讲述了在Redis开发中遇到的两个常见问题:1)返回值类型不匹配导致的错误,如将Long预期为Integer;2)使用lua库时,需注意Redis内置的库功能,避免不必要的cjson引入。作者强调了在编写脚本时考虑Redis的内置环境和库的使用方式。

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

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

 好了就到这里,如果用什么不懂的可以留言评论或者私信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值