Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis:Zum Festlegen des Timeouts für ein Schlüsselwertpaar in Set

Unglücklicherweise nicht. Die „Container“ von Redis (d. h. Listen, Hashes, Sets und sortierte Sets) unterstützen kein Ablaufen pro Mitglied, obwohl diese Funktionalität in der Vergangenheit viele Male angefordert wurde.

Sie können jedoch Ihre eigene Logik implementieren, um dieses Ergebnis zu erzielen. Es gibt mehrere mögliche Ansätze, um dies zu beheben – hier ist ein Beispiel. Anstatt einen Satz zu verwenden, verwenden Sie einen sortierten Satz (ZSET) und legen Sie die Punktzahl jedes Mitglieds mithilfe von Epochenwerten auf seine Ablaufzeit fest. Ein solcher Workflow könnte beispielsweise mit einem Lua-Skript implementiert werden. Um Mitglieder hinzuzufügen, verwenden Sie etwas wie:

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 Gegenstände aus dem Set tatsächlich „ablaufen“ zu lassen, müssen Sie sie löschen, sobald ihre Zeit abgelaufen ist. Sie können dies tun, indem Sie entweder einen regelmäßigen Prozess implementieren, der Ihre Liste scannt, oder wenn Sie darauf zugreifen. Zum Beispiel kann das folgende Lua verwendet werden, um Mitglieder auslaufen zu lassen:

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

und werten Sie es aus, indem Sie '1 a' als Argumente für Ihr Beispiel verwenden.

BEARBEITEN:Wie man das Obige mit Python erreicht

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')