我正在使用Redisson的RMapCache结构,因为它支持按生存时间逐出的条目以及设置地图的最大大小。虽然Java中的所有内容都没有问题,但我发现使用相同Redis实例的NodeJS应用程序无法从相同的底层HSET结构中获取值。
问题是当使用RMapCache时,Redisson会为HSET中的每个值预先设置2个字节:
在花费一些时间挖掘Redisson源代码后,我发现在插入过程中使用了Lua脚本,该脚本有以下几行:
local val = struct.pack('dLc0', tonumber(ARGV[4]), string.len(ARGV[6]), ARGV[6]);
redis.call('hset', KEYS[1], ARGV[5], val);
ARGV [6]本身就是值,所以其他两个字节是:
这有效地使Redis HSET不能用于除Redisson之外的其他语言或Java客户端。
有人遇到同样的问题,知道如何处理吗?
答案 0 :(得分:1)
RMapCache
完全是一个Redisson创作,它支持有界和无界的能力,并且可以通过生存时间逐步驱逐。没有其他语言和客户支持这些功能,因为Redis不支持这些功能。
Redisson将与各个元素相关的元信息与每个值相关联,但这并不是唯一需要使RMapCache
按预期工作的技巧。
其他客户可能通过解压缩数据并忽略元数据来读取值,但更改值而不经过Redisson可能会导致Redisson客户端出现意外行为。