2014-03-05 8 views
5

Derzeit verwende ich die grundlegende mset Funktion, um einen Schlüssel/Wert zu speichern;Redis-Python Einstellung mehrerer Schlüssel/Werte in einem Vorgang

from common.redis_client import get_redis_client 
cache = get_redis_client() 
for k,v in some_dict.items(): 
    kw = {'key': value} 
    cache.mset(kw) 

#later: 
    cache.get('key') 

Ich speichere jeden Schlüssel/Wert separatly (nicht in einem json zum Beispiel) Da die gesamte dict Speicherung würde es in einen String drehen und würde mich erfordern Serialisierung/Deserialisierung auf Speichern und Abrufen und ich wirklich Zugang benötigen Schlüssel/Werte trennen.

Meine Frage :: gibt es eine Möglichkeit, ich kann mset mehrere Schlüssel/Werte auf einmal? Anstatt mehrere Schreibvorgänge in die redisc db? Und umgekehrt kann ich mehrere Lesevorgänge in einem Zugriff haben? (Und ja - ich habe eine Menge redis Aktivität geht und mit hohen Last mich darüber egal.)

Antwort

12

aktualisiert nach Agis Kommentar

Wenn Sie Redis-py, die derzeit der empfohlene Redis-Client Für Python können Sie das Pipelining verwenden, das genau das tut, was Sie wollen. Hier ist ein einfaches Beispiel:

>>> r = redis.Redis(...) 
>>> r.set('bing', 'baz') 
>>> # Use the pipeline() method to create a pipeline instance 
>>> pipe = r.pipeline() 
>>> # The following SET commands are buffered 
>>> pipe.set('foo', 'bar') 
>>> pipe.get('bing') 
>>> # the EXECUTE call sends all buffered commands to the server, returning 
>>> # a list of responses, one for each command. 
>>> pipe.execute() 
[True, 'baz'] 

Ich weiß nicht, welche redis Client Sie verwenden, aber es entweder unterstützt das Pipelining, oder Sie sollen Schalen betrachten Redis-py.

Werfen Sie einen Blick auf redis documentation about pipelining; es wird erklärt, dass Sie einen x5-Leistungsschub erwarten können - aber auch, dass Sie keine zu großen Massenoperationen durchführen müssen (10 000 Operationen bei jeder Ausführung sind in Ordnung).

+0

Beachten Sie, dass Pipelining immer noch die gleiche Anzahl von Schreibvorgängen macht. Jedoch wird es Sie vor der Hin- und Rückfahrt sparen: http://redis.io/topics/pipelining – Agis

+0

Auch 'MULTI' und' EXEC' geht es um * Transaktionen *, nicht Pipelining. – Agis

+0

Sie haben Recht, ich werde meinen Beitrag bearbeiten. –

0

Da Sie zum Speichern eines Wörterbuchs zu suchen scheint, sehe ich zwei weitere mögliche Lösungen:

  1. Verwenden HMGET/HMSET Befehle. Dadurch können mehrere einzelne Schlüssel aus einem Wörterbuch abgerufen und gesetzt werden. Der Nachteil ist, dass alles auf einem Schlüssel liegt. Wenn Sie einen Schlüsselablauf für einzelne dict-Einträge planen, wie es beim Caching üblich ist, wird dies für Sie nicht funktionieren.

  2. Ich entschied mich, MGET und MSET Befehle zu verwenden. Dies ermöglicht es, mehrere Schlüssel gleichzeitig zu setzen und sie gleichzeitig abzurufen. Sie verwendet bereits die MSET (Multi-Set) Befehl in Ihrem Beispiel, sondern setzen nur einen Wert ...

Ihr Beispiel könnte so funktionieren:

cache.mset(some_dict)

Sie wollen hinzufügen ein gemeinsamer Präfix zu Ihren Wörterbuch-Einträgen:

cache.mset({'prefix:' + k:v for k,v in some_dict.items()})

auf diese Weise werden in der Lage Sie Retr ieve Ihre dict Einträge mit MGET per Schlüssel. Wenn Sie die Schlüssel nicht im Voraus kennen, können Sie zuvor einen KEYS Befehl mit einem "prefix: *" Platzhalter ausführen.