redis Lua 脚本 返回的数据 无法序列化

北风几吹夏 / 2024-10-15 / 原文

问题

如果我需要获取Hash类型的所有键值,应该怎么获取呢

cmd = "redis.call('HGETALL', key)"

如果是直接使用以上命名,将会直接报序列化失败
(我这里的redis是使用FastJson2JsonRedisSerializer进行序列化)

redis存储的数据内容

目前,我觉得原因就是序列化的时候,类型转换错误
因为lua语言对于查询hash数据返回的是一个数组,如{"accuracy",156,"inaccuracy",0},在json进行序列化是,很明显一个文本一个整数,自然就报错了

解决办法

使用cjson.encode将返回的数据全部转化为字符串,然后通过java遍历生成对应类型数据

// Lua脚本:批量获取所有传入keys的值
String luaScript = "local result = {} " +
        "for i, key in ipairs(KEYS) do " +
        "    local value = " + cmd +
        "    result[i] = value " +
        "end " +
        // "return result";
        "return cjson.encode(result)";
// 处理 Lua 脚本的返回值
List<E> finalResult = new ArrayList<>();
// 将 List 转换为 HashMap
List<Object> hashList = (List<Object>) value;
Map<String, String> map = new HashMap<>();
for (int i = 0; i < hashList.size(); i += 2) {
    map.put((String) hashList.get(i), (String) hashList.get(i + 1));
}
finalResult.add((E) map);

redis Lua 脚本 返回的数据 无法序列化