Подтвердить что ты не робот

Проверка того, существует ли значение в списке уже Redis

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

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

Спасибо.

4b9b3361

Ответ 1

Ваши варианты следующие:

  • Используя LREM и заменив его, если он был найден.
  • Поддержание отдельного SET в сочетании с вашим LIST
  • Прокрутка через LIST до тех пор, пока вы не найдете элемент или не достигнете конца.

Списки Redis реализованы как http://en.wikipedia.org/wiki/Linked_list, следовательно, ограничения.

Я думаю, что ваш лучший вариант - поддерживать дубликат SET. Это то, что я обычно делаю. Просто подумайте об этом как о дополнительном индексе. Независимо от того, убедитесь, что ваши действия являются атомарными с MULTI - EXEC или сценариями Lua.

Ответ 2

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

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

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


Таблица хешей

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

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


Отсортированный набор

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

  • ZSCORE
  • ZRANK
  • ZREVRANK

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

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


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

Ответ 3

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

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