Redisson - RMapCache 在值的开头添加了2个额外的字节

我正在使用 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 在其他语言或 Java 客户端中除了 Redisson 之外无法使用。

有人遇到了同样的问题,知道如何解决吗?

点赞
用户8190596
用户8190596

RMapCache 是完全由 Redisson 创建的,支持有界与无界容量,并具有按生存时间逐个逐出条目的功能。由于 Redis 不支持这些功能,因此其他语言和客户端都不支持这些功能。

Redisson将与每个值相关的元信息打包到每个值旁边,但这并不是它必须执行的唯一技巧,以使 RMapCache 能够按预期工作。

其他客户端可能能够通过解包数据来读取值并忽略元数据,但是未经过 Redisson 更改值可能会在 Redisson 客户端端引起意外行为。

2017-09-25 09:09:13