Проверка, существует ли значение в списке уже Redis - PullRequest
39 голосов
/ 16 февраля 2012

Мне интересно, есть ли способ проверить, существует ли ключ в списке повторного ввода?

Я не могу использовать набор, потому что не хочу применять уникальность, но хочучтобы иметь возможность проверить, есть ли строка на самом деле.

Спасибо.

Ответы [ 4 ]

64 голосов
/ 17 февраля 2012

Возможны следующие варианты:

  1. Использование LREM и замена его, если он был найден.
  2. Сохранение отдельного SET в сочетании с вашим LIST
  3. Цикл по LIST, пока вы не найдете элемент или не достигните конца.

Списки Redis реализованы как http://en.wikipedia.org/wiki/Linked_list,, отсюда и ограничения.1018 * Я думаю, что ваш лучший вариант - сохранение дубликата SET.Это то, что я склонен делать.Просто подумайте об этом как о дополнительном индексе.В любом случае, убедитесь, что ваши действия являются атомарными с помощью MULTI - EXEC или сценариев Lua.

23 голосов
/ 18 августа 2014

Списки допускают дубликаты, но не предоставляют простой способ проверки существования, и, как советовал @Fritzy, вам необходимо:

  • Выполните несколько операций (удалите, затем добавьте снова, если найдено во время удаления) для простых проверок = Стоимость во времени
  • Ведение отдельного набора = Стоимость в памяти

Я удивлен, что никто не советовал вам использовать Хеш-таблицу или Sorted Set , которые сочетают в себе преимущества , допускающие двойственность (сохраняя количество элементов в качестве значения - Хеш-таблица или счет - Сортированный набор ) и индексирование элементов по типу хеш-таблицы / набора.


Хеш-таблица

Чтобы проверить наличие ключа, используйте HEXISTS для определенного поля, которое возвращает 0, если указанный элемент не существует. Вы также можете использовать команду HGET. Возвращает ответ nil, если указанный член не существует.

Чтобы добавить новый элемент, просто используйте HINCRBY, который либо обновит значение (т. Е. Количество элементов с именем элемента), либо создаст новый элемент, если он не существует.


Сортированный набор

Чтобы проверить наличие ключа, используйте одну из трех следующих команд:

  • ZSCORE
  • ZRANK
  • ZREVRANK

Они возвращают nil ответ, если указанный член не существует.

Чтобы добавить нового участника, просто используйте ZINCRBY, который либо обновит счет (т.е. количество элементов с именем участника), либо создаст нового участника, если он не существует.


Суммируя: Сортированные наборы или Хеш-таблицы позволяют выполнять все операции с вашими требованиями с помощью одной команды .

5 голосов
/ 02 ноября 2018

Я удивлен, что никто не упомянул набор , который отлично решил вопрос.
Используя значение ключа sismember в set , он проверяет, является ли значение членом ключа.
Вот пример:

redis 127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
redis 127.0.0.1:6379> SISMEMBER myset1 "hello"
(integer) 1
redis 127.0.0.1:6379> SISMEMBER myset1 "world"
(integer) 0
5 голосов
/ 16 февраля 2012

Нет, нет способа проверить, содержит ли список повторного ввода заданное значение. См. Команды Redis list для справки.

Полагаю, вы могли бы использовать LREM для (попытки) удаления значения и проверки возвращаемого значения, чтобы увидеть, было ли оно удалено. Но тогда вам придется положить его обратно, и это кажется сомнительным. Возможно, есть лучшее решение вашей проблемы - чего вы пытаетесь достичь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...