2017-09-24 191 views
0

我使用的是Redisson的RMapCache结构,因为它支持按生存时间驱逐的条目以及设置映射的最大大小。尽管Java中的所有工作都没有问题,但我发现使用相同Redis实例的NodeJS应用程序无法从相同的底层HSET结构获取值。Redisson - RMapCache将2个额外的字节前缀为

的问题是,预先考虑Redisson 2个字节到HSET每个值时RMapCache使用: 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]是值本身,因此其他的两个字节是:在MI

  • 最大空闲时间lliseconds(可以通过把方法)
  • 长度值

这实际上使Redis的HSET从其他语言或其他Java客户端,然后Redisson无法使用。

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

回答

0

RMapCache完全是一个雷利森的创造,它支持有限和无限的能力,并随着时间的推移而逐个进入。没有其他语言和客户端支持这些功能,因为它们不受Redis支持。

Redisson打包每个值旁边的单个元素相关的元信息,但这不是唯一的技巧,它使RMapCache按预期工作。

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