På den aktuelle udgivelsesgren af Redis (2.6) , kan du ikke få meddelelser, når varer er udløbet. Det vil sandsynligvis ændre sig med de næste versioner.
I mellemtiden, for at understøtte dit krav, skal du manuelt implementere understøttelse af udløbsmeddelelser. Så du har:
session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>
Du skal fjerne sessionid
fra brugerindstillingen, når sessionen udløber. Så du kan opretholde et ekstra sorteret sæt, hvis score er et tidsstempel.
Når du opretter session 10 for bruger 100:
MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC
Derefter skal du bygge en dæmon, som vil polle zset for at identificere den session, der skal udløbe (ZRANGEBYSCORE
). For hver udløbet session skal den vedligeholde datastrukturen:
- pop sessionen ud af zset (
ZREMRANGEBYRANK
) - hent sessionsbruger-id (
HMGET
) - slet session (
DEL
) - fjern session fra bruger-id-sæt (
SREM
)
Den største vanskelighed er at sikre, at der ikke er nogen raceforhold, når dæmonen poller og behandler emnerne. Se mit svar på dette spørgsmål for at se, hvordan det kan implementeres:
hvordan håndterer man session expire ved at basere redis?