Op de huidige release-tak van Redis (2.6) , kunt u geen meldingen ontvangen wanneer artikelen zijn verlopen. Het zal waarschijnlijk veranderen met de volgende versies.
In de tussentijd moet u ter ondersteuning van uw vereiste handmatig ondersteuning voor verloopmeldingen implementeren. Dus je hebt:
session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>
U moet sessionid
verwijderen van de gebruikersset wanneer de sessie verloopt. U kunt dus een extra gesorteerde set bijhouden waarvan de score een tijdstempel is.
Wanneer u sessie 10 aanmaakt voor gebruiker 100:
MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC
Vervolgens moet u een daemon bouwen die de zset zal pollen om de sessie te identificeren die moet verlopen (ZRANGEBYSCORE
). Voor elke verlopen sessie moet het de datastructuur behouden:
- pop de sessie uit de zset (
ZREMRANGEBYRANK
) - sessie gebruikers-ID ophalen (
HMGET
) - sessie verwijderen (
DEL
) - verwijder sessie uit set gebruikers-ID (
SREM
)
De grootste moeilijkheid is om ervoor te zorgen dat er geen race-omstandigheden zijn wanneer de daemon de items peilt en verwerkt. Zie mijn antwoord op deze vraag om te zien hoe het kan worden geïmplementeerd:
hoe om te gaan met het verlopen van sessies op basis van redis?