2014-06-08 4 views
5

zu setzen, habe ich eine Redis mit Schlüssel 'a' und Wert '1', '2', '3' gesetzt. Gibt es eine Möglichkeit, unterschiedliche Ablaufzeit für jedes Schlüssel-Wert-Paar in der Gruppe festzulegen.Redis: Um Timeout für ein Schlüsselwertpaar in Set

Zum Beispiel ('a', '1') sollte nach 60 Sekunden ablaufen, während (a ',' 2 ') nach 120 Sekunden ablaufen sollte.

Antwort

6

Leider nicht. Redis '"Container" (d. H. Listen, Hashes, Mengen und sortierte Mengen) unterstützen nicht den Ablauf pro Mitglied, obwohl diese Funktionalität in der Vergangenheit oft angefordert wurde.

Sie können jedoch Ihre eigene Logik implementieren, um dieses Ergebnis zu erzielen. Es gibt mehrere mögliche Ansätze, um dies anzugehen - hier ist ein Beispiel. Verwenden Sie statt einer Menge eine sortierte Menge (ZSET) und setzen Sie die Punktzahl jedes Mitglieds mit Epochenwerten auf die Verfallszeit. Diese Art von Workflow könnte beispielsweise mithilfe eines Lua-Skripts implementiert werden. So fügen Sie Mitglieder wie etwas verwenden:

redis.call('zadd', KEYS[1], os.time()+ARGV[1], ARGV[2]) 

und EVAL es mit '1 a 60 1' und '1 a 120 2' als Argumente pro Ihrem Beispiel. Um die Elemente aus dem Set tatsächlich zu "verfallen", müssen Sie sie löschen, sobald ihre Zeit abgelaufen ist. Sie können dies tun, indem Sie einen periodischen Prozess implementieren, der Ihre Liste scannt oder darauf zugreift. Zum Beispiel kann die folgende Lua verwendet werden Mitglieder abzulaufen:

redis.call('zremrangebyscore', KEYS[1], '-inf', os.time()) 

und EVAL es mit ‚1a‘ als Argumente pro Ihrem Beispiel.

EDIT: Wie die obigen zu erreichen Python

import time 
import redis 

def add(r, key, ttl, member): 
    r.zadd(key, member, int(time.time()+ttl)) 

def expire(r, key): 
    r.zremrangebyscore(key, '-inf', int(time.time())) 

... 

r = redis.Redis() 
add(r, 'a', 1, 60) 
add(r, 'a', 2, 120) 

# periodically or before every operation do 
expire(r, 'a') 
+0

Vielen Dank für Ihre Erklärung sehr viel, ist es ein Beispiel dafür, wie dies mit Python zu erreichen. – user3218088

+0

Hinzugefügt etwas Python-Code (ungetestet obwohl) - hoffentlich wird es einfacher für Sie zu implementieren :) –

+0

... und danke für die Änderungen - sagte Ihnen, es wurde nicht getestet;) –