Dies mag eine einfache Frage sein, aber es fällt mir schwer, die Antwort zu finden. Wie geht Redis 2.0 mit dem maximal zugewiesenen Speicher um? Wie entscheidet es, welche Daten entfernt oder welche Daten gespeichert werden sollen?
111
Antworten:
Wenn Sie die Funktionalität des virtuellen Speichers aktiviert haben (neu in Version 2.0 oder 2.2, glaube ich), beginnt Redis, die "nicht so häufig verwendeten" Daten auf der Festplatte zu speichern, wenn der Speicher knapp wird.
Wenn der virtuelle Speicher in Redis deaktiviert ist, scheint der virtuelle Speicher des Betriebssystems aufgebraucht zu sein (dh auszutauschen), und die Leistung sinkt enorm.
Jetzt können Sie Redis auch mit einem maxmemory-Parameter konfigurieren, der verhindert, dass Redis mehr Speicher verwendet (Standardeinstellung).
Neuere Versionen von Redis haben verschiedene Richtlinien, wenn maxmemory erreicht ist:
Wenn Sie eine Richtlinie auswählen, die nur Schlüssel mit einem EXPIRE-Satz entfernt, sieht es so aus, als würde das Programm die malloc () -Operation nur abbrechen, wenn Redis keinen Speicher mehr hat. Das heißt, wenn Sie versuchen, mehr Daten zu speichern, schlägt der Vorgang nur kläglich fehl.
Einige Links für weitere Informationen (da Sie nicht einfach mein Wort dafür nehmen sollten):
quelle
Von redis.conf , Version 2.8
quelle
maxmemory-policy
in Redis 3.2 ist jetztnoeviction
: raw.githubusercontent.com/antirez/redis/3.2/redis.confUpdate redis 4.0
quelle
Ich habe erst kürzlich angefangen, über Redis zu lesen, daher bin ich nicht positiv. Aber ich bin auf ein paar Leckerbissen gestoßen, die nützlich sein könnten.
Hier ist ein Ausschnitt aus http://antirez.com/post/redis-as-LRU-cache.html :
Außerdem verfügt Redis 2.0 über einen VM-Modus, in dem alle Schlüssel in den Speicher passen müssen. Die Werte für die selten verwendeten Schlüssel können sich jedoch auf der Festplatte befinden:
quelle
Wenn Sie sich fragen, was Redis (2.8) tatsächlich reagiert, wenn es das durch seine Konfiguration definierte Maximum erreicht, sieht es folgendermaßen aus:
quelle
Ich hatte kürzlich eine Situation ohne freien Speicher und meine Anwendung kam zum Stillstand (Schreibvorgänge nicht möglich, Lesevorgänge waren möglich). Das Ausführen von PHP-Skripten wurde auf halbem Weg gestoppt und musste
kill -9
manuell ausgeführt werden (auch nachdem der Arbeitsspeicher vorhanden war) verfügbar gemacht).Ich habe angenommen, dass ein Datenverlust (oder eine Dateninkonsistenz) aufgetreten ist, also habe ich eine durchgeführt
flushdb
und aus Sicherungen wiederhergestellt. Lektion gelernt? Backups sind dein Freund.quelle
Redis ist kein Cache wie memcached. Standardmäßig (wobei der
maxmemory-policy
Parameter auf gesetzt istnoeviction
) werden alle Daten, die Sie in redis eingeben, nicht entfernt. Die einzige Ausnahme ist die Verwendung von EXPIRE.quelle