0

我正在使用 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] 本身就是值,所以其他两个字节是:

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

这有效地使 Redis HSET 无法从 Redisson 以外的其他语言或 Java 客户端使用。

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

4

1 回答 1

1

RMapCache完全是 Redisson 的创作,它支持有界和无界容量,并根据生存时间逐个逐出条目。没有其他语言和客户端支持这些功能,因为 Redis 不支持它们。

Redisson 将与单个元素相关的元信息与每个值一起打包,但这并不是它必须拉动以RMapCache按预期工作的唯一技巧。

其他客户端可能能够通过解包数据并忽略元数据来读取该值,但是在不经过 Redisson 的情况下更改该值可能会导致 Redisson 客户端出现意外行为。

于 2017-09-25T09:09:13.260 回答