Come appare il messaggio
OOM command not allowed when used memory > 'maxmemory'.Cause frequenti
- È attiva
maxmemory-policy noeviction, il valore predefinito: Redis non elimina nulla e rifiuta le scritture. - Chiavi senza TTL riempiono la memoria, per esempio voci di cache che non scadono mai.
- Una singola chiave grande cresce senza limite: una lista, un hash o un set usato come coda.
- Frammentazione e buffer di replica portano
used_memorysopra il limite anche se i dati sono meno. - Dopo un riavvio manca
maxmemorynella configurazione e Redis cresce fino a esaurire la RAM dell'host.
Verifica
- Memoria, limite e policy
redis-cli INFO memory | grep -E 'used_memory_human|maxmemory_human|maxmemory_policy' - Trova le chiavi più grandi
redis-cli --bigkeys - Conta le chiavi eliminate
redis-cli INFO stats | grep evicted_keys - Quota di chiavi senza TTL in un campione
redis-cli --scan --count 1000 | head -n 1000 | while read k; do redis-cli TTL "$k"; done | grep -c '^-1$'
Soluzione
- Scegli la policy con criterio: per una cache pura usa
allkeys-lruoallkeys-lfu, così Redis libera spazio da solo. - Tieni
noevictionsolo se Redis contiene dati che non possono andare persi. In quel caso aggiungi memoria e imposta i TTL. - Metti un TTL su ogni chiave di cache, anche su quelle che sembrano permanenti.
- Dividi o limita le chiavi grandi;
--bigkeysmostra i candidati. - Tieni
maxmemoryben sotto la RAM dell'host, per lasciare spazio a snapshot e copy-on-write.
Domande frequenti
Perché Redis non elimina le chiavi vecchie?
Perché maxmemory-policy è noeviction, il valore predefinito.
Perdo dati passando a allkeys-lru?
Sì, le chiavi vecchie vengono eliminate. Va bene per una cache, non per code o sessioni.