2017-09-28 2 views
0

Ich benutze ein Spring Redis Repository und ich bin verwirrt mit dem Löschvorgang und dem Phantomschlüssel.löschen Schlüssel/Wert von Redis - Phantomschlüssel nicht gelöscht

Wenn ein Löschvorgang ausgeführt wird, wird der Phantomschlüssel nicht gelöscht, ist das ein normales Verhalten? Wenn ja, ist es möglich, eine Löschung des Phantomschlüssels zu erzwingen, wenn der ursprüngliche Schlüssel aus dem Code gelöscht wird.

Ich erwartete, dass ein Löschen den ursprünglichen Schlüssel und den zugehörigen Phantomschlüssel entfernt.

Ich plante, TimeToLive-Funktion zu verwenden, um sicherzustellen, dass Schlüssel, die nicht von meiner Anwendung gelöscht werden, nach einer Weile ablaufen.

Annotation auf dem betreffenden Domain-Objekt gesetzt

@RedisHash(value = "requestContext", timeToLive = 9000) 

Das Löschen wird auf diese Weise durchgeführt:

repository.delete(id) 

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

0

Der Phantomschlüssel wird nicht sofort gelöscht, wenn Sie Schlüssel/Wert aus Redis löschen. Spring Data Redis verwaltet Phantomschlüssel zur Verwaltung sekundärer Indizes zusammen mit anderen Funktionen. Spring Data Redis speichert eine Kopie des ursprünglichen Hash als Phantom-Hash mit einer etwas längeren TTL (5 Minuten). Das bedeutet : Phantom TTL in Redis ist 5 Minuten mehr als die normale TTL-Schlüssel. Wenn der ursprüngliche Hash abläuft, Spring Data Redis die Phantom Hash lädt usw. Cleanups wie das Entfernen von Referenzen von Sekundärindizes auszuführen mehr lesen: Redis key Expirations

Wenn der Ablauf auf einen positiven Wert eingestellt ist der entsprechende Befehl EXPIRE wird ausgeführt. Zusätzlich zum Fortbestehen des Originals wird eine Phantomkopie in Redis beibehalten und so eingestellt, dass sie 5 Minuten nach dem Original abläuft. Dies geschieht, damit die Repository-Unterstützung RedisKeyExpiredEvent mit dem abgelaufenen Wert über Springs ApplicationEventPublisher veröffentlichen kann, wenn ein Schlüssel abläuft, obwohl die ursprünglichen Werte bereits verschwunden sind. Ablaufereignisse werden für alle verbundenen Anwendungen mit Spring Data Redis-Repositorys empfangen.

Verwandte Themen