So sieht die Meldung aus
OOM command not allowed when used memory > 'maxmemory'.Häufige Ursachen
maxmemory-policy noevictionist aktiv, die Voreinstellung. Redis verdrängt dann nichts, sondern lehnt Schreibbefehle ab.- Keys ohne TTL füllen den Speicher, etwa Cache-Einträge, die nie ablaufen.
- Ein einzelner großer Key wächst unbegrenzt: eine Liste, ein Hash oder ein Set als Warteschlange.
- Fragmentierung und Replikationspuffer treiben
used_memoryüber das Limit, obwohl die Daten selbst kleiner sind. - Nach einem Neustart fehlt
maxmemoryin der Konfiguration, dann wächst Redis bis der Host-Speicher vollläuft.
Prüfen
- Speicher, Limit und Policy
redis-cli INFO memory | grep -E 'used_memory_human|maxmemory_human|maxmemory_policy' - Die größten Keys finden
redis-cli --bigkeys - Verdrängte Keys zählen
redis-cli INFO stats | grep evicted_keys - Anteil der Keys ohne TTL in einer Stichprobe
redis-cli --scan --count 1000 | head -n 1000 | while read k; do redis-cli TTL "$k"; done | grep -c '^-1$'
Lösung
- Policy bewusst wählen: für reine Cache-Nutzung
allkeys-lruoderallkeys-lfu, dann schafft Redis selbst Platz. noevictionnur behalten, wenn Redis Daten hält, die nicht verloren gehen dürfen. Dann Speicher erhöhen und TTLs setzen.- TTL auf alle Cache-Keys setzen, auch wenn sie „ewig“ gültig wirken.
- Große Keys aufteilen oder begrenzen;
--bigkeyszeigt die Kandidaten. maxmemorydeutlich unter dem Host-RAM lassen, damit Snapshots und Copy-on-Write Platz haben.
Häufige Fragen
Warum schreibt Redis nicht einfach alte Keys weg?
Weil maxmemory-policy auf noeviction steht. Das ist die Voreinstellung.
Gehen Daten verloren, wenn ich auf allkeys-lru umstelle?
Ja, alte Keys werden verdrängt. Für Cache ist das gewollt, für Queue- oder Session-Daten nicht.