Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis, Sitzungsablauf und Reverse-Lookup

Auf dem aktuellen Release-Zweig von Redis (2.6) , können Sie keine Benachrichtigungen erhalten, wenn Artikel abgelaufen sind. Dies wird sich wahrscheinlich mit den nächsten Versionen ändern.

In der Zwischenzeit müssen Sie zur Unterstützung Ihrer Anforderung die Unterstützung für Ablaufbenachrichtigungen manuell implementieren. Sie haben also:

session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>

Sie müssen sessionid entfernen aus dem Benutzersatz, wenn die Sitzung abläuft. So können Sie einen zusätzlichen sortierten Satz pflegen, dessen Punktzahl ein Zeitstempel ist.

Wenn Sie Sitzung 10 für Benutzer 100 erstellen:

MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC

Dann müssen Sie einen Daemon erstellen, der das Zset abfragt, um die abzulaufende Sitzung zu identifizieren (ZRANGEBYSCORE ). Für jede abgelaufene Sitzung muss die Datenstruktur beibehalten werden:

  • Kopieren Sie die Sitzung aus dem zset (ZREMRANGEBYRANK )
  • Benutzer-ID der Sitzung abrufen (HMGET )
  • Sitzung löschen (DEL )
  • Sitzung aus Benutzer-ID-Satz entfernen (SREM )

Die Hauptschwierigkeit besteht darin, sicherzustellen, dass es keine Race-Bedingungen gibt, wenn der Daemon die Elemente abfragt und verarbeitet. Siehe meine Antwort auf diese Frage, um zu sehen, wie es implementiert werden kann:

Wie behandelt man Session Expiring basierend auf Redis?