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_1
läuft wie erwartet ab, aber ich sehe keinen effizienten Weg, um das entsprechende Mitglied aus dem tag:tag_1
Set 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?
Antworten:
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
quelle
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öschenZREMRANGEBYSCORE -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.
quelle
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
quelle