Салат несколько реактивных магазинов Redis и транзакций через магазины - PullRequest
0 голосов
/ 24 ноября 2018

Я изучаю, что Redis для Java - это то, что, я думаю, мне действительно не хватает в API Redis.
Скажем, у нас есть следующий код для создания соединения:

RedisClient redisClient = RedisClient
  .create("redis://password@localhost:6379/");
StatefulRedisConnection<String, String> connection
 = redisClient.connect();

Это определяетклиент для типа ключа String и типа значения String.
Теперь, что мне делать, когда мне нужно обрабатывать несколько объектов Redis, например, не только String / String, но, например, несколько наборов с разными типами?
Должен ли я создатьразные подключения для каждого?
Я пытался использовать реактивные шаблоны, но столкнулся с той же проблемой, что и создание нескольких экземпляров с разными типами.

При работе с транзакциями я не понимаю, как использовать транзакцию для одного шаблона.
Например, я хочу вставить сериализованный пост в хранилище Redis, например:

Key postId | Value <post> 

Но в одной транзакции я также хочу добавить postId в набор, представляющий канал:

Key topic | Value <set with post Id's>

Все найденные примеры выполняют транзакции по одному и тому же шаблону, но я понятия не имею, какпродолжить с этим.
Указатели приветствуются.

1 Ответ

0 голосов
/ 03 декабря 2018

Часть String, String при определении StatefulRedisConnection применима только к используемому кодеку.Когда вы определяете:

StatefulRedisConnection<String, String> connection = redisClient.connect();

предопределенный StringCodec используется RedisClient для передачи данных между Java-клиентом и Redis.

Здесь вы можете использовать свой пользовательский кодек, если хотитеизменить способ кодирования и декодирования ключей и значений при передаче данных туда и обратно между Redis и Client.Подробнее о RedisCodec здесь .

Для решения вашей проблемы.Вы по-прежнему должны иметь возможность использовать одно и то же соединение для различных типов операций, при условии, что все ключ и значения имеют String с.Для ключей и значений типа Object их следует сериализовать и передать сериализованные результаты вышеуказанному соединению.

Вот пример фрагмента (не запускался / не тестировал это).

RedisClient redisClient = RedisClient.create("redis://password@localhost:6379/0");
StatefulRedisConnection<String, String> connection = redisClient.connect();
RedisCommands<String, String> syncCommands = connection.sync();
syncCommands.multi();
syncCommands.sadd("topics", "value1", "value2", "value3"); // Puts topics in the set
syncCommands.set("posts", "serialized post"); // Puts serialized post
syncCommands.exec();

Надеюсь, это поможет.

...