我想在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();
}
我在&#34; test2&#34;的Redis值(serializedList)中反序列化没有问题:
eval "local r = redis.call('zrange', 'test2', 0, 1); return cmsgpack.unpack(r[1]);" 0
1) "foo"
2) "bar"
不幸的是,我无法处理序列化地图。没试好,我试过这样的事情:
eval "local r = redis.call('zrange', 'test', 0, 1); return cmsgpack.unpack(r[1]);" 0
(empty list or set)
任何人都可以给我一个提示如何正确地做到这一点吗?
答案 0 :(得分:1)
请参阅Redis EVAL
documentation的 Lua和Redis数据类型之间的转换部分。正如您所看到的,Lua to Redis转换规则只处理:
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了解更多详情。