Уникальное значение в списке/наборе redis

Я хочу сделать список существующих продуктов в redis но я хочу сначала проверить, существует ли имя продукта (дубликат проверки).

мой список в настоящее время принимает дубликаты, поэтому: может ли кто-нибудь помочь мне показать, как добавить уникальное значение в список?

4 ответов


вместо использования списка используйте набор. Наборы-это контейнеры для уникальных объектов. Каждый объект может появиться только один раз в наборе. Взгляните на набор связанных команд здесь: http://redis.io/commands/#set.

и пример использования redis-cli (мы пытаемся добавить "продукт один" дважды, но он появляется только один раз в списке продуктов):

$ redis-cli
127.0.0.1:6379> sadd products "Product One"
(integer) 1
127.0.0.1:6379> sadd products "Product Two"
(integer) 1
127.0.0.1:6379> sadd products "Product Three"
(integer) 1
127.0.0.1:6379> sadd products "Product One"
(integer) 0
127.0.0.1:6379> smembers products
1) "Product Three"
2) "Product One"
3) "Product Two"
127.0.0.1:6379>

Это мое (безрассудное) решение сохранить список Redis уникальным. (в онлайне)

def push_item_to_the_list(LIST_KEY, item)
 insert_status = Redis.linsert(LIST_KEY, 'before', item, item)

 if insert_status == -1
   Redis.lpush(LIST_KEY, item)
 else
   Redis.lrem(LIST_KEY, 1, item)
 end
end

каждый раз, когда вы хотите пуш или вставить пункт в вашем списке, проверьте, если LINSERT команда сможет поместить этот элемент сразу после того же элемента (это единственный способ проверить, находится ли элемент уже в списке redis или нет).

если LINSERT вернет статус -1, это означает, что он не смог найти элемент в вашем списке - все в порядке (вы можете нажать или вставить его сейчас).

если LINSERT вернет другое значение (размер списка в другом случае) - это означает, что он уже смог найти элемент и смог вставить другой элемент сразу после предыдущего. Это означает, что у вас есть (по крайней мере one) дублирование вашего товара. Вы можете удалить один из них.


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

127.0.0.1:6379> zadd products 1 "Product One"
(integer) 1
127.0.0.1:6379> zadd products 2 "Product Two"
(integer) 1
127.0.0.1:6379> zadd products 3 "Product Tree"
(integer) 1
127.0.0.1:6379> zadd products 4 "Product Four"
(integer) 1
127.0.0.1:6379> zrange products 0 -1
1) "Product One"
2) "Product Two"
3) "Product Tree"
4) "Product Four"

почему бы просто не назвать Redis.lrem раньше? Поэтому, если он находит какие-либо вхождения элемента, удаляет их, иначе ничего не будет делать. Что-то вроде этого:--3-->

def push_item_to_the_list(LIST_KEY, item)
   Redis.lrem(LIST_KEY, 0, item)
   Redis.lpush(LIST_KEY, item)
end