Aller au contenu

Redis : expiration et mémoire

SET session:abc "données" EX 3600 # expire dans 3600 s
EXPIRE cle 60 # définir ou modifier
PEXPIRE cle 1500 # en millisecondes
EXPIREAT cle 1893456000 # à un instant Unix
TTL cle # secondes restantes (-1 : sans expiration, -2 : inexistante)
PTTL cle
PERSIST cle # supprime l'expiration

Une commande qui réécrit une clé (SET sans option) supprime son expiration : repasser EX à chaque écriture si nécessaire.

Sans limite, Redis consomme la mémoire disponible jusqu’à ce que le système tue le processus. Définir maxmemory :

Fenêtre de terminal
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE # écrit les valeurs dans redis.conf

Ou dans /etc/redis/redis.conf :

maxmemory 256mb
maxmemory-policy allkeys-lru
Politique Comportement quand la limite est atteinte
noeviction Refuse les écritures (erreur OOM) : défaut
allkeys-lru Supprime les clés les moins récemment utilisées : cache général
allkeys-lfu Supprime les moins fréquemment utilisées
volatile-lru Idem, parmi les clés qui ont une expiration
volatile-ttl Supprime d’abord celles qui expirent bientôt
allkeys-random Suppression aléatoire

Redis utilisé comme cache : allkeys-lru ou allkeys-lfu. Redis utilisé comme base de données (files, sessions à conserver) : noeviction, et surveiller la mémoire.

Fenêtre de terminal
redis-cli INFO memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation_ratio"
redis-cli MEMORY USAGE cle # octets d'une clé
redis-cli MEMORY STATS
redis-cli --bigkeys
redis-cli INFO stats | grep -E "evicted_keys|expired_keys"
Champ Lecture
used_memory_human Mémoire utilisée par les données
mem_fragmentation_ratio Fortement supérieur à 1,5 : fragmentation ; inférieur à 1 : échange sur disque (swap)
evicted_keys Clés supprimées faute de place : s’il augmente, la limite est trop basse

Avertissement fréquent dans le journal : overcommit_memory is set to 0. Recommandé sur un serveur dédié à Redis :

Fenêtre de terminal
echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/99-redis.conf
sudo sysctl --system

L’option évite les échecs de sauvegarde en arrière-plan sur une machine presque pleine.

  • Toujours donner une expiration aux clés de cache.
  • Préfixer les clés (cache:…) pour pouvoir les cibler.
  • Ne pas stocker de valeurs très volumineuses.
  • Prévoir que toute clé peut disparaître : l’application doit savoir reconstruire la valeur.
Symptôme Piste
OOM command not allowed when used memory > 'maxmemory' Politique noeviction et limite atteinte : augmenter maxmemory, choisir une politique d’éviction ou purger
Clés qui disparaissent Expiration ou éviction : TTL, evicted_keys
Mémoire qui ne baisse pas après suppression Fragmentation : redémarrage planifié, MEMORY PURGE
Processus tué par le système maxmemory non défini : journalctl -k | grep -i "out of memory"

Ubuntu 24.04 et 26.04 : différences à connaître

Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »

Ces réglages sont identiques avec Redis 7.0 et 8.0.