C'est peut-être une question facile, mais j'ai du mal à trouver la réponse. Comment Redis 2.0 gère-t-il le manque de mémoire allouée maximale? Comment décide-t-il quelles données supprimer ou quelles données conserver en mémoire?
111
Réponses:
Si vous avez activé la fonctionnalité de mémoire virtuelle (nouveau dans la version 2.0 ou 2.2, je pense), Redis commence à stocker les données "pas si fréquemment utilisées" sur le disque lorsque la mémoire est épuisée.
Si la mémoire virtuelle dans Redis est désactivée, il semble que la mémoire virtuelle du système d'exploitation commence à s'épuiser (c.-à-d. Swap), et les performances diminuent considérablement.
Désormais, vous pouvez également configurer Redis avec un paramètre maxmemory, qui empêche Redis d'utiliser plus de mémoire (par défaut).
Les nouvelles versions de Redis ont diverses politiques lorsque la mémoire maximale est atteinte:
Si vous choisissez une stratégie qui supprime uniquement les clés avec un ensemble EXPIRE, alors lorsque Redis manque de mémoire, il semble que le programme abandonne simplement l'opération malloc (). Autrement dit, si vous essayez de stocker plus de données, l'opération échoue lamentablement.
Quelques liens pour plus d'informations (puisque vous ne devriez pas me croire sur parole):
la source
À partir de redis.conf , version 2.8
la source
maxmemory-policy
par défaut dans Redis 3.2 est maintenantnoeviction
: raw.githubusercontent.com/antirez/redis/3.2/redis.confMettre à jour redis 4.0
la source
J'ai récemment commencé à lire sur Redis, donc je ne suis pas sûr. Mais, je suis tombé sur quelques bribes qui peuvent être utiles.
Voici un extrait de http://antirez.com/post/redis-as-LRU-cache.html :
De plus, Redis 2.0 a un mode VM où toutes les clés doivent tenir en mémoire, mais les valeurs des clés rarement utilisées peuvent être sur le disque:
la source
Si vous vous demandez ce que Redis (2.8) répond réellement lorsqu'il atteint le maximum défini par sa configuration, cela ressemble à ceci:
la source
J'ai récemment vécu une situation sans mémoire libre et mon application s'est arrêtée (les écritures ne sont pas possibles, les lectures étaient possibles), l'exécution de scripts PHP s'est arrêtée à mi-chemin et a dû être
kill -9
manuellement (même après que la mémoire était mise à disposition).J'ai supposé qu'une perte de données (ou une incohérence des données) s'était produite, alors j'ai fait une
flushdb
et restauré à partir de sauvegardes. Leçon apprise? Les sauvegardes sont votre ami.la source
Redis n'est pas un cache comme memcached, par défaut (où le
maxmemory-policy
paramètre est défini surnoeviction
) toutes les données que vous mettez dans redis ne seront pas supprimées, la seule exception est l'utilisation d'EXPIRE.la source