2014-10-16 17 views
5

Desidero creare un elenco di prodotti esistenti in redis ma voglio verificare se il nome prodotto esiste già per primo (controllo duplicato).Valore univoco in lista/set redis

La mia lista attualmente accetta duplicati, quindi: Qualcuno può aiutarmi a mostrare come aggiungere un valore univoco nell'elenco?

risposta

13

Invece di utilizzare un elenco, utilizzare un set. Gli insiemi sono contenitori per oggetti unici. Ogni oggetto può apparire solo una volta in un set. Dai un'occhiata ai comandi relativi alle impostazioni qui: http://redis.io/commands/#set.

E un esempio usando Redis-cli (si cerca di aggiungere "prodotto One" due volte, ma sembra solo una volta nella lista dei prodotti):

$ 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> 
+4

... e se avete bisogno del vostro "elenco" in ordine - utilizzare un set ordinato :) –

0

In caso di necessità di mantenere l'ordine e l'unicità è possibile utilizzare un set ordinato

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" 
+2

C'è un modo per ottenere una coda con oggetti unici in redis? Quindi un set ordinato ma voglio fare un pop qualcosa di fronte e poi continuare a scoppiare. :-) – adrian

1

Questa è la mia soluzione (imprudente) per mantenere Redis lista unica. (implementazione in Ruby)

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 

Ogni volta quando si desidera spinta o inserto elemento all'elenco, verificare se LINSERT comando sarà in grado di mettere questo articolo dopo la stessa voce (questa è l'unico modo che conosco per verificare se l'elemento è già presente nella lista redis o meno).

Se LINSERT restituisce lo stato -1, significa che non è stato possibile trovare l'elemento nell'elenco: è tutto ok (è possibile inserirlo o inserirlo ora).

Se LINSERT restituirà un altro valore (dimensione dell'elenco in altri casi), significa che è stato in grado di trovare già l'articolo ed è stato possibile inserire un altro elemento, subito dopo quello precedente. Significa che hai (almeno una) duplicazione del tuo articolo. Puoi cancellare uno di questi ora.

Problemi correlati