Jedis фильтрует значения в hmset

У меня есть некоторые значения в Redis с этой ключевой структурой

key:1:abc -> votes -> 0
          -> name  -> John 

key:1:xyz -> votes -> 0
          -> name  -> Mary 

key:1:def -> votes -> 1
          -> name  -> Larry

key:2:ijk -> votes -> 0
          -> name  -> apple

Вот как выглядит мое пространство ключей. Я использую hmset для хранения данных в Redis. «Ключ: 1» — это заполнитель для идентификации разных пользователей в определенном пространстве, а часть после «ключа: 1» — это уникальный дифференциатор для каждой записи в «ключ: 1». Я хочу написать код для фильтрации данных из Redis для получения всех записей, у которых количество голосов равно 0. Таким образом, вывод кода jedis должен быть примерно таким

key:1:abc -> votes -> 0
          -> name  -> John 

key:1:xyz -> votes -> 0
          -> name  -> Mary 

И Ларри отфильтровывается. Я искал hmscan для решения этой проблемы, но не уверен, как будет выглядеть команда. Любая подсказка о том, что я могу сделать, чтобы получить этот результат? Как вы думаете, какой будет временная сложность, чтобы получить это время?


person anonymous123    schedule 02.04.2015    source источник
comment
Почему бы не использовать zset в Redis для этого рейтинга с ключом в качестве значения и голосами в качестве оценки? Вы будете обновлять этот zset каждый раз, когда пользователь изменяет свой голос.   -  person zenbeni    schedule 02.04.2015


Ответы (1)


Для этого есть несколько решений, но первое, что приходит на ум, — это использование вспомогательной структуры.

Каждый раз, когда вы добавляете элемент в HASH, вы также добавляете имя человека в SET:

> SADD zerocount "Larry"
(integer) 1
> SADD zerocount "Mary"
(integer) 1

Всякий раз, когда вам нужен список имен с нулевым количеством, вы можете выполнить SSCAN (дает вам разбиение на страницы):

> sscan zerocount 0
1) "0"
2) 1) "Mary"
2) "Larry"

Например, в момент, когда вы увеличите значение Ларри, вы удалите это значение из набора:

> srem zerocount "Larry"
1

SADD равно O(N) для каждого добавленного участника, в данном случае O(1). SSCAN — это O(1) для каждого вызова, а SREM — это O(1) для нашего сценария, в общем случае O(N), где N — это количество удаляемых участников.

person bitoiu    schedule 02.04.2015