comment gérer session expire en se basant sur redis?
Je suis voulons mettre en œuvre à la session de magasin de fonder redis,j'ai mis les données de session dans le redis. Mais je ne sais pas comment gérer la session expire.Je peux en boucle tout le redis clés(sessionid) et evaulate la lastaccess et maxidle de données,donc j'ai besoin de charger toutes les clés en client,et il y a peut-être 1000m clés de session et peut conduire très pool de la performance I/O.
Je veut leur laisser le redis gérer l'expiration,mais il y a pas d'auditeur ou de rappel lorsque la clé expire,il est donc impossible de tigre HttpSessionListener.
des conseils?
source d'informationauteur L.J.W
Vous devez vous connecter pour publier un commentaire.
De sorte que vous besoin de votre demande afin d'être notifié lorsqu'une session expire, dans le Redis.
Tout Redis ne prend pas en charge cette fonctionnalité, il y a un certain nombre de trucs que vous pouvez utiliser pour la mettre en œuvre.
Mise à jour: à Partir de la version 2.8.0, Redis prend en charge cette http://redis.io/topics/notifications
D'abord, les gens pensent à ce sujet: c'est encore en discussion, mais il pourrait être ajouté dans une prochaine version de Redis. Voir les questions suivantes:
Maintenant, voici quelques solutions que vous pouvez utiliser avec le courant Redis versions.
Solution 1: mise à jour corrective Redis
En fait, l'ajout d'une simple notification lorsque Redis effectue clé d'expiration n'est pas si difficile que ça. Il peut être mis en œuvre par l'ajout de 10 lignes de la db.c fichier de Redis code source. Voici un exemple:
https://gist.github.com/3258233
Ce correctif à court postes clés à la #expiré liste si la clé a expiré et commence par le caractère ' @ ' (choix arbitraire). Il peut facilement être adapté à vos besoins.
Il est alors trivial de l'utilisation de l'EXPIRATION ou de la SETEX commandes pour définir un délai d'expiration pour vos objets de session, et à écrire un petit démon qui passe en boucle sur BRPOP à retirer à partir de la "#expiré" de la liste, et de propager la notification dans votre application.
Un point important est de comprendre comment l'expiration du fonctionnement du mécanisme de Redis. Il y a en fait deux chemins différents pour l'expiration, à la fois active en même temps:
Paresseux (passive) mécanisme. L'expiration peut se produire chaque fois qu'une touche est accessible.
Mécanisme actif. Un poste en interne, régulièrement (au hasard) des échantillons d'un certain nombre de touches à l'expiration de jeu, en essayant de trouver ceux qui sont le point d'expirer.
Noter que le correctif ci-dessus fonctionne très bien avec les deux chemins.
La conséquence en est le Redis délai d'expiration n'est pas exacte. Si toutes les clés d'expiration, mais un seul est sur le point d'être périmés, et elle n'est pas accessible, l'actif de l'expiration de l'emploi peut prendre plusieurs minutes pour trouver la clé et expiré. Si vous avez besoin d'un peu de justesse dans la notification, ce n'est pas la voie à suivre.
Solution 2: simulation d'expiration avec zsets
L'idée ici est de ne pas s'appuyer sur le Redis clé d'expiration mécanisme, mais les simuler à l'aide d'un index supplémentaire, plus un bureau de vote le démon. Il peut fonctionner avec un non modifié Redis version 2.6.
Chaque fois qu'une session est ajouté à Redis, vous pouvez exécuter:
La to_be_expired ensemble trié est juste un moyen efficace d'accéder à la première clés qui devraient être expiré. Un démon peut interroger sur to_be_expired à l'aide de la suite de Lua script côté serveur:
La commande pour lancer le script serait:
Le démon à plus de 10 articles. Pour chacun d'eux, il doit utiliser la commande DEL pour supprimer les sessions, et de notifier l'application. Si un élément a été effectivement traitées (c'est à dire le retour de script Lua n'est pas vide), le démon doit en boucle immédiatement, sinon 1 seconde d'attendre de l'état peuvent être mis en place.
Merci pour le script Lua, il est possible de lancer plusieurs bureaux de démons en parallèle (le script garantit qu'une session donnée ne sera traitée qu'une fois, car les clés sont supprimées de to_be_expired par le script Lua lui-même).
Solution 3: utiliser un externe distribué minuterie
Une autre solution est de s'appuyer sur un externe distribués à rebours. Le beanstalk léger système de file d'attente est une bonne possibilité pour cette
Chaque fois qu'une session est ajouté dans le système, l'application de postes de l'ID de session à un beanstalk file d'attente avec un retard correspondant au temps de session. Un démon est à l'écoute de la file d'attente. Quand il peut retirer un élément, cela signifie une session a expiré. Il suffit de nettoyer la séance dans le Redis, et de notifier l'application.