java - Redis:使用消息包在 Lua 中读取 Java Map

标签 java lua redis msgpack

我想在 Redis 中存储 Java 数据结构。我用 Java 编写的代码如下:

public static void main(String[] args) throws IOException {
    Map<String, String> map = new HashMap<String, String>();
    map.put("foo", "1");
    map.put("bar", "2");
    map.put("baz", "3");
    ArrayList<String> list = new ArrayList<String>();
    list.add("foo");
    list.add("bar");
    MessagePack mp = new MessagePack();
    byte[] serializedMap = mp.write(map);
    byte[] serializedList = mp.write(list);
    Jedis jedis = new Jedis("localhost");
    jedis.zadd("test".getBytes(), 1000, serializedMap);
    jedis.zadd("test2".getBytes(), 1000, serializedList);
    jedis.close();
}

我在“test2”的 Redis 值(serializedList)中反序列化没有问题:

eval "local r = redis.call('zrange', 'test2', 0, 1); return cmsgpack.unpack(r[1]);" 0
1) "foo"
2) "bar"

不幸的是,我无法处理 serializedMap。我试过,但没有运气,是这样的:

eval "local r = redis.call('zrange', 'test', 0, 1); return cmsgpack.unpack(r[1]);" 0
(empty list or set)

谁能告诉我如何正确地做到这一点?

最佳答案

请引用Redis EVAL documentationLua和Redis数据类型转换部分.如您所见,Lua 到 Redis 的转换规则仅处理:

  • Lua表(数组)=序列,
  • 带有单个ok 字段的 Lua 表,
  • 带有单个 err 字段的 Lua 表。

这就是不处理通用映射的原因(它被截断为 Lua 数组中的第一个 nil,如果有的话):

$ redis-cli
> eval 'return cmsgpack.pack{foo="1", bar="2", baz="3"}' 0
"\x83\xa3baz\xa13\xa3bar\xa12\xa3foo\xa11"
> eval 'return cmsgpack.unpack(ARGV[1])' 0 "\x83\xa3baz\xa13\xa3bar\xa12\xa3foo\xa11"
(empty list or set)

注意:另请参阅 this answer了解更多详情

关于java - Redis:使用消息包在 Lua 中读取 Java Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28317369/

相关文章:

Lua读取只读文件

redis - Redis中的 "AUTH"是什么以及如何使用它?

Php Redis 连接问题

java - 测试 Spring MVC Controller 的 @MessageMapping WebSocket 方法

java - HashMap 值在所有键中被替换

lua - 访问其他文件上的 Lua 函数

python - 如何在python上获取系统时间(服务器redis)

java - 使用Spring集成从spymemcached获取超时

java - 重新加载保留 session 的 JVM 进程

lua - 在lua中将字节序列转换为ASCII字符串