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é?
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