Redis: чтение карты Java в Lua с использованием пакета сообщений

1

Я хочу хранить структуры данных Java в Redis. Я написал код на 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();
}

У меня нет проблем с десериализацией значения Redis (serializedList) из "test2":

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)

Может ли кто-нибудь дать мне подсказку, как это сделать правильно?

Теги:
lua
redis
msgpack

1 ответ

1

См. Раздел Преобразование между типами данных Lua и Redis документации Redis EVAL. Поскольку вы можете видеть, что правила преобразования Lua в Redis обрабатывают только:

  • Таблица Lua (массив) = последовательность,
  • Lua стол с одним ok полем,
  • Lua с одним полем err.

Вот почему общая карта не обрабатывается (она усекается до первого нуля внутри массива Lua, если таковая имеется):

$ 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)

Примечание: см. Также этот ответ для более подробной информации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню