sql >> Database >  >> NoSQL >> Redis

Redis, verlopen sessie en reverse lookup

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?



  1. ondersteunt hibernate-redis cache op het tweede niveau die wordt gedeeld door verschillende hibernate-instanties?

  2. het MongoDB-cachesysteem begrijpen

  3. VersionError:Geen overeenkomend document gevonden fout op Node.js/Mongoose

  4. MongoDB-query om alleen ingesloten document te retourneren