2017-04-06 3 views
0

Ich muss eine Struktur in Redis erstellen, um das folgende Problem zu modellieren, das 3 Entitäten betrifft: Benutzer, Knoten und Socket (alle String-IDs). Zum Beispiel kann der Benutzer U1 mit dem Knoten N1 mit den Sockeln S1 und S2 verbinden, aber er kann auch mit dem Knoten N2 mit den Sockeln S3 und S4 verbinden.Implementieren von Referenzsätzen in Redis

Ich muss in der Lage sein, die Sockets, die mit einem Knoten eines bestimmten Benutzers verbunden sind, einfach zu aktualisieren, wenn er sich verbindet oder trennt. Außerdem muss jeder Socket nach einer gewissen Zeit ablaufen, wenn keine Aktion ausgeführt wird. Zu jeder Zeit muss ich wissen, ob ein Benutzer mit mindestens einem Socket verbunden ist (unabhängig vom Knoten).

Ich modellierte das Problem mit 2 Arten von Set (ich verwendete Hashtag für den Cluster): 1- eine Menge mit Schlüssel {U: U1} skt: NX, die Sockets verbunden, zum Beispiel mit N1 für die Benutzer U1 2- ein Satz mit Schlüssel {u: U1} skts, der die anderen Sätze enthält, zum Beispiel "{u: U1} skt: N1", "{u: U1} skt: N2", ...

Mit dieser Struktur kann ich einfach die Sets {u: U1} skt: NX aktualisieren, indem Sie Mitglieder hinzufügen oder entfernen. Außerdem kann ich das folgende Lua-Skript verwenden, um zu überprüfen, ob ein Benutzer mit einem Socket verbunden ist (unabhängig vom Knoten).

local indexes = redis.call("smembers", KEYS[1]) 
return redis.call("sunion", unpack(indexes)) 

Ist dies der richtige Ansatz? Wie kann ich die Ablaufzeit eines Mitglieds eines Sets implementieren?

Antwort

0

Redis hat keine Auswirkungen auf den Inhalt der Datenstrukturen. Ein gängiges Muster zum Implementieren des Ablaufdatums in Sets besteht darin, stattdessen sortierte Sets zu verwenden und einen Zeitstempel oder einen Versionswert in der Punktzahl der Elemente zu speichern. Ablauf wird dann zu einer einfachen Angelegenheit, Mitglieder zu entfernen, die niedrig genug Punkte haben (mit dem ZREMBYSCORE Befehl).