Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Redisson-RMapCache在值前面加上2个字节_Java_Lua_Redis_Redisson - Fatal编程技术网

Java Redisson-RMapCache在值前面加上2个字节

Java Redisson-RMapCache在值前面加上2个字节,java,lua,redis,redisson,Java,Lua,Redis,Redisson,我使用Redisson的RMapCache结构,因为它支持按生存时间和设置地图的最大大小逐出条目。虽然在Java中一切正常,但我发现使用相同Redis实例的NodeJS应用程序无法从相同的底层HSET结构中获取值 问题在于,当使用RMapCache时,Redisson会为HSET中的每个值预加2个字节: 在花了一些时间挖掘Redisson源代码之后,我找到了插入过程中使用的Lua脚本,它有以下几行: local val = struct.pack('dLc0', tonumber(ARGV

我使用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无法从其他语言或Java客户机(而不是Redisson)中使用


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

RMapCache
完全是一个Redisson产品,它支持有界容量和无界容量,并随时间推移逐出单个条目。没有其他语言和客户端支持这些功能,因为Redis不支持这些功能

Redisson将与各个元素相关的元信息打包在每个值的旁边,但这并不是使
RMapCache
按预期工作所需的唯一技巧

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