web-dev-qa-db-fra.com

Comment redis expire-t-il les clés?

Comment Redis met-il en œuvre l'expiration des clés? De ici J'ai appris que Redis stocke l'heure à laquelle la clé expirera, mais comment est-ce exactement implémenté?

32
Ayush Gupta

En bref - pour chaque objet redis, il y a un délai d'expiration. À moins que vous ne définissiez l'objet pour qu'il expire, ce temps est "jamais".

Maintenant, le mécanisme d'expiration lui-même est semi-paresseux. L'expiration différée signifie que vous n'expirez pas réellement les objets jusqu'à ce qu'ils soient lus. Lors de la lecture d'un objet, nous vérifions son horodatage d'expiration, et si c'est dans le passé, nous ne retournons rien et supprimons l'objet pendant que nous y sommes. Mais le problème est que si une touche n'est jamais touchée, elle prend juste de la mémoire sans raison.

Redis ajoute donc une deuxième couche d'expiration active aléatoire. Il lit simplement les clés aléatoires tout le temps, et lorsqu'une touche expirée est touchée, elle est supprimée en fonction du mécanisme paresseux. Cela n'affecte pas le comportement d'expiration, il ajoute simplement un "garbage collection" des clés expirées.

Bien sûr, la mise en œuvre réelle est plus compliquée que cela, mais c'est l'idée principale.

Vous pouvez en savoir plus à ce sujet ici: http://redis.io/commands/expire

Et le code source du cycle d'expiration actif peut être trouvé ici: https://github.com/antirez/redis/blob/unstable/src/server.c#L781

76
Not_a_Golfer