Уникальное значение в списке/наборе 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