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')
Vielen Dank für Ihre Erklärung sehr viel, ist es ein Beispiel dafür, wie dies mit Python zu erreichen. – user3218088
Hinzugefügt etwas Python-Code (ungetestet obwohl) - hoffentlich wird es einfacher für Sie zu implementieren :) –
... und danke für die Änderungen - sagte Ihnen, es wurde nicht getestet;) –