2013-06-12 4 views
37

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

mir eine Struktur für Tags vorgeschlagen durch Redis Dokumentation verwendet - die Daten sind einfach Schlüssel-Wert-Paare, und die Etikett sind Sätze Schlüssel entsprechend jeden Tag enthalten, z.B.

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

Der Schlüssel id:id_1 wie erwartet ablaufen, aber ich nicht eine effiziente Art und Weise finden Sie in der entsprechenden aus dem tag:tag_1 Satz zu entfernen.

Ein Weg, ich kam mit einem Cron-Job mit einem Skript, die abgelaufenen Schlüssel aus den Sätzen in regelmäßigen Abständen entfernen würde - durch Hinzufügen aller Tag-Namen zu einem anderen Satz und dann durchlaufen alle Tags, dann alle entsprechenden IDs Tag und prüfen, ob entsprechende Taste vorhanden ist - wenn nicht, SREM aufrufen.

Ich glaube nicht, dass es ein effizienter Weg sein, und ich würde möglicherweise die Tags so sauber wie möglich halten möchte, weil die Größe der Sätze wahrscheinlich Leistung des Suchens durch mehrere Tags (SINTER) auswirken wird. Gibt es einen "inneren" Weg?

Antwort

15

Es ist nicht möglich, direkt Objekte in der Liste, setzt oder zsets ablaufen.

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

Siehe die Antwort auf diese Frage, ich denke, es zu Ihrem Anwendungsfall gilt (Session durch ID ersetzen, und Benutzer von Tag):

Redis, session expiration, and reverse lookup

+0

Ja, es ist ein anständiger Weg und ich werde wahrscheinlich das Problem mit etwas Ähnlichem behandeln. Da die Existenz von abgelaufenen Mitgliedern in Tag-Sets auf keine andere Weise ein Problem darstellt als die Performance, werde ich höchstwahrscheinlich ein periodisch laufendes Cron anstelle eines Deamons verwenden - um Umfragen auf ein ausreichendes Minimum zu beschränken. – Przemek

20

Nein, dies ist nicht möglich (und not planned either). Der recommended Ansatz ist eine geordnete Menge mit Score-Set verwenden zeitzustempeln und dann manuell abgelaufene Schlüssel zu entfernen. Um nach nicht abgelaufenen Schlüsseln zu fragen, können Sie ZRANGEBYSCORE $now +inf verwenden, um abgelaufene Schlüssel zu löschen, ZREMRANGEBYSCORE -inf $now wird den Trick tun.

In meiner Anwendung erstelle ich einfach beide Befehle jedes Mal, wenn ich das Set abfrage. Ich kombiniere dies auch mit (lang) Ablaufzeit am Set selbst schließlich, um nicht verwendete Sätze zu spülen.

This article geht durch es im Detail.