2014-10-16 13 views
5

Ich möchte eine Liste der vorhandenen Produkte in redis machen, aber ich möchte überprüfen, ob der Produktname bereits existiert (doppelte Prüfung).Eindeutiger Wert in redis list/set

Meine Liste akzeptiert derzeit Duplikate, also: Kann mir jemand helfen, zu zeigen, wie man einen eindeutigen Wert in der Liste hinzufügt?

Antwort

13

Verwenden Sie anstelle einer Liste ein Set. Sets sind Container für eindeutige Objekte. Jedes Objekt kann nur einmal in einem Set vorkommen. Sehen Sie sich die satzbezogenen Befehle hier an: http://redis.io/commands/#set.

Und ein Beispiel unter Verwendung von redis-cli (wir versuchen, hinzuzufügen „Product One“ zweimal, aber es erscheint nur einmal in der Liste der Produkte):

$ 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

... und wenn Sie Ihre "Liste" in der Reihenfolge benötigen - verwenden Sie eine Sorted Set :) –

0

Im Fall, dass Sie die halten, um und die Einzigartigkeit können Sie verwenden ein

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

Gibt es eine Möglichkeit, eine Warteschlange mit einzigartigen Elementen in redis zu bekommen? Also ein sortiertes Set, aber ich möchte etwas von vorne heraus poppen und dann weiter poppen. :-) – adrian

1

Dieser Satz sortiert ist meine (rücksichtslose) Lösung zu halten Redis Liste einzigartig. (Implementierung 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 

Jedes Mal, wenn Sie Push oder Einsatz Artikel Ihre Liste mögen, prüfen Sie, ob LINSERT Befehl Lage sein wird, dieses Produkt nur nach dem gleichen Punkt zu setzen (dies ist der einzige Weg, ich weiß zu überprüfen, ob der Artikel bereits in der Liste ist oder nicht).

Wenn LINSERT den Status -1 zurückgibt, bedeutet das, dass es kein Element in Ihrer Liste gefunden hat - alles ist in Ordnung (Sie können es jetzt drücken oder einfügen).

Wenn LINSERT einen anderen Wert zurückgibt (Größe der Liste in einem anderen Fall) - bedeutet das, dass es bereits einen Artikel gefunden hat und es einen anderen Artikel einfügen konnte, gleich nach dem vorherigen. Es bedeutet, dass Sie (mindestens) eine Duplizierung Ihres Artikels haben. Sie können jetzt einen von ihnen löschen.