Какой самый эффективный способ создания среднего / большого списка / set / zset / hash в redis? - PullRequest
5 голосов
/ 12 января 2011

Используя redis , существует ряд команд для извлечения целых структур данных ( LRANGE для списков, SMEMBERS для наборов, ZRANGE для отсортированных наборов и HGETALL для хэшей).

Только у хэша есть метод ( HMSET ) для вставки нескольких элементов одной командой.

Во всех примерах, которые я видел, было добавлено по одному элементу за раз в список (через RPUSH или LPUSH ) или набор (через )SADD / ZADD ).

Более конкретная проблема, которую я хочу решить, состоит в создании списков и отсортированных наборов, содержащих идентификаторы базы данных, эти списки уникальны для каждого пользователя и содержатот нескольких сотен до нескольких тысяч идентификаторов.

Они обычно собираются из запроса к базе данных, немного массируются в памяти и затем сохраняются в redis для разбивки на страницы (списки) или выполнения операций на основе набора для извлечения подмножеств(наборы и отсортированные наборы).

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

redis> RPUSH employee:ids 1000
(integer) 1
redis> RPUSH employee:ids 1001
(integer) 2
redis> RPUSH employee:ids 1002
(integer) 3
redis> RPUSH employee:ids 1003
(integer) 4
redis> del employee:ids
(integer) 1

Я думаю, что используя транзакцию с MULTI и EXEC может помочь превратить его в один запрос, но это не поможет с повторным нажатием клавиши.

redis> MULTI
OK
redis> RPUSH employee:ids 1000
QUEUED
redis> RPUSH employee:ids 1001
QUEUED
redis> RPUSH employee:ids 1002
QUEUED
redis> RPUSH employee:ids 1003
QUEUED
redis> RPUSH employee:ids 1004
QUEUED
redis> EXEC
1. (integer) 1
2. (integer) 2
3. (integer) 3
4. (integer) 4
5. (integer) 5

Есть ли что-то, чего мне не хватает, что позволило бы мне добавлять элементы в списки / наборы одной командой или без повторения ключа каждый раз?

Я тожеиспользуя клиентскую библиотеку jedis, если это имеет значение (или если есть другая библиотека, которую я могу использовать из JVM, которая будет лучше).

1 Ответ

4 голосов
/ 12 января 2011

Настройка транзакции здесь не поможет. Цель транзакций - обеспечить одновременное выполнение команд, чтобы на сервере никогда не было половины списка. Их по-прежнему отправляют по одному.

Несколько команд действительно вызывают проблемы с производительностью? 1000 элементов на самом деле не так много, и пока вы не делаете что-то вроде открытия нового соединения для каждого элемента, не должно быть никаких задержек.

...