it-swarm.com.de

TTL für ein festgelegtes Mitglied

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 wird - 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 erwartungsgemäß ab, aber ich sehe keine effiziente Möglichkeit, das entsprechende Mitglied aus dem Satz tag:tag_1 Zu entfernen.

Eine Möglichkeit besteht darin, einen Cron-Job zu verwenden, der ein Skript enthält, mit dem abgelaufene Schlüssel von Zeit zu Zeit aus Sets entfernt werden. Dazu werden alle Tag-Namen zu einem anderen Set hinzugefügt, anschließend alle Tags durchlaufen und anschließend alle IDs für jedes Tag überprüft Der entsprechende Schlüssel ist vorhanden. Wenn nicht, rufen Sie SREM auf.

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

54
Przemek

Es ist nicht möglich, Elemente in Listen, Mengen oder Zsets direkt ablaufen zu lassen.

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

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

Redis, Sitzungsablauf und Reverse Lookup

28
Didier Spezia

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

In meiner Anwendung gebe ich einfach bei jeder Abfrage des Satzes beide Befehle aus. Ich kombiniere dies auch mit einer (langen) Verfallszeit am Set selbst, um eventuell nicht verwendete Sets zu löschen.

Dieser Artikel geht es genauer durch.

42
Václav Slavík

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

0
Milad