TTL für ein festgelegtes Mitglied

71

Ist es in Redis möglich, TTL (Time to Live) nicht für einen bestimmten Schlüssel, sondern für ein Mitglied für einen Satz festzulegen?

Ich verwende eine Struktur für Tags, die in der Redis-Dokumentation vorgeschlagen wurden. Die Daten sind einfache Schlüssel-Wert-Paare, und die Tags sind Sätze, die Schlüssel enthalten, die jedem Tag entsprechen, z

> SETEX id:id_1 100 'Lorem ipsum'
OK
> SADD tag:tag_1 id:id_1
(integer) 1

Der Schlüssel id:id_1läuft wie erwartet ab, aber ich sehe keinen effizienten Weg, um das entsprechende Mitglied aus dem tag:tag_1Set zu entfernen .

Eine Möglichkeit, die ich gefunden habe, besteht darin, einen Cron-Job zu verwenden, der ein Skript enthält, das abgelaufene Schlüssel regelmäßig aus Sätzen entfernt - indem alle Tag-Namen zu einem anderen Satz hinzugefügt und dann alle Tags durchlaufen werden, dann alle IDs, die jedem Tag entsprechen, und überprüft werden, ob entsprechender Schlüssel existiert - wenn nicht, aufrufen SREM.

Ich denke nicht, dass dies ein effizienter Weg ist, und ich möchte möglicherweise die Tags so sauber wie möglich halten, da die Größe der Sets wahrscheinlich die Leistung der Suche nach mehreren Tags beeinflusst ( SINTER). Gibt es einen "internen" Weg?

Przemek
quelle
Dies könnte helfen
y2k-shubham

Antworten:

35

Es ist nicht möglich, Elemente in Listen, Sets oder Zsets direkt abzulaufen.

Sie müssen einen Mechanismus implementieren, der benachrichtigt wird, wenn das Masterelement abläuft, damit Sie die entsprechenden Sätze entsprechend verwalten können.

Siehe die Antwort auf diese Frage. Ich denke, sie gilt für Ihren Anwendungsfall (Sitzung durch ID und Benutzer durch Tag ersetzen):

Redis, Sitzungsablauf und Reverse Lookup

Didier Spezia
quelle
Ja, es ist ein anständiger Weg und ich werde das Problem wahrscheinlich mit etwas Ähnlichem lösen. Da die Existenz abgelaufener Mitglieder in Tag-Sets kein anderes Problem als die Leistung darstellt, verwende ich höchstwahrscheinlich einen regelmäßig ausgeführten Cron anstelle eines Deamons, um die Abfragen auf ein ausreichendes Minimum zu beschränken.
Przemek
61

Nein, das ist nicht möglich (und auch nicht geplant ). Der empfohlene Ansatz besteht darin, einen geordneten Satz zu verwenden, dessen Punktzahl auf den Zeitstempel eingestellt ist, und dann abgelaufene Schlüssel manuell zu entfernen. Um nicht abgelaufene Schlüssel abzufragen, können Sie verwenden ZRANGEBYSCORE $now +inf, um abgelaufene Schlüssel zu löschen ZREMRANGEBYSCORE -inf $now.

In meiner Anwendung gebe ich einfach jedes Mal beide Befehle aus, wenn ich den Satz abfrage. Ich kombiniere dies auch mit (langer) Ablaufzeit am Set selbst, um nicht verwendete Sets zu löschen.

Dieser Artikel geht ausführlicher darauf ein.

Václav Slavík
quelle
4
Dies könnte die bisher beste Lösung sein, bis Redis sie nativ unterstützt. Denken Sie daran, dass das Einfügen in die sortierte Menge O (logN) ist.
Linehrr
2
Der Artikel-Link ist defekt. Gibt es eine neue URL?
Bob Whitelock
@ Bob Whitelock das könnte helfen
y2k-shubham
0

Sie können Elemente in einer Liste nicht direkt ablaufen lassen, es ist jedoch möglich, ein Lua-Skript auf Ihrem Redis-Server zu registrieren und diese Funktionalität zu Redis hinzuzufügen. Redis Ablauf basierend auf Wert

Milux
quelle