Redisson - RMapCache预先添加2个额外字节值

时间:2017-09-24 17:55:06

标签: java lua redis redisson

我正在使用Redisson的RMapCache结构,因为它支持按生存时间逐出的条目以及设置地图的最大大小。虽然Java中的所有内容都没有问题,但我发现使用相同Redis实例的NodeJS应用程序无法从相同的底层HSET结构中获取值。

问题是当使用RMapCache时,Redisson会为HSET中的每个值预先设置2个字节: enter image description here

在花费一些时间挖掘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]本身就是值,所以其他两个字节是:

  • 最大空闲时间(以毫秒为单位)(可以传递给put方法)
  • 价值长度

这有效地使Redis HSET不能用于除Redisson之外的其他语言或Java客户端。

有人遇到同样的问题,知道如何处理吗?

1 个答案:

答案 0 :(得分:1)

RMapCache完全是一个Redisson创作,它支持有界和无界的能力,并且可以通过生存时间逐步驱逐。没有其他语言和客户支持这些功能,因为Redis不支持这些功能。

Redisson将与各个元素相关的元信息与每个值相关联,但这并不是唯一需要使RMapCache按预期工作的技巧。

其他客户可能通过解压缩数据并忽略元数据来读取值,但更改值而不经过Redisson可能会导致Redisson客户端出现意外行为。