Wenn Sie mit Java arbeiten und Spring verwenden, besteht eine gute Chance, dass Ihre Schlüssel in Redis so aussehen
\xac\xed\x00\x05t\x00\x0amyrediskey
Schlüssel in Redis können nur Strings sein, aber mit Spring können Sie auch Java-Objekte speichern. Standardmäßig konvertiert Spring das Java-Objekt mit dem JDK-Serializer. Der JDK-Serialisierungsprogramm fügt diese \xac\xed...
hinzu ` Byte.
Die Lösung ist normalerweise eine 1-zeilige Änderung - weisen Sie spring an, StringRedisSerializer zu verwenden. Diese Änderung betrifft jedoch nur neue Schlüssel. Vorhandene Schlüssel verbleiben weiterhin in Redis, sind aber für Java nicht zugänglich.
Wenn Sie bereits Daten in der Produktion haben, müssen Sie mehr tun. Ein Ansatz besteht darin, Schlüssel umzubenennen und die Binärdaten loszuwerden.
Java-kodierte Schlüssel umbenennen
Wir haben kürzlich ein Java-Skript veröffentlicht, das solche Schlüssel automatisch repariert. Siehe hashedin/redis-rename-java-encoded-keys.
Der allgemeine Ansatz ist:
- Schlüssel scannen und nach Schlüsseln suchen, die mit
\xac\xed\x00\x05
beginnen - das ist die Signatur für java-kodierte Objekte - Versuchen Sie, in ein Java-Objekt zu deserialisieren.
- Wenn erfolgreich und wenn das Objekt vom Typ String ist, dann den Schlüssel umbenennen
- Wenn es sich um einen Cluster handelt, funktioniert der Umbenennungsschlüssel nicht. Sichern Sie in diesem Fall den Schlüssel und stellen Sie ihn unter dem neuen Namen wieder her
Ausführen in der Produktion
- Sie müssen zuerst die Codeänderung vornehmen, um die Verwendung von Jdk Serializer zu beenden
- Zu diesem Zeitpunkt schlagen Lesevorgänge von Redis fehl, da der Code nach serialisierten Objekten sucht
- Starten Sie nun die Ausführung des Skripts, um die Daten zu korrigieren
Zukünftige Verbesserungen
- Um Ausfallzeiten zu reduzieren, können Sie die Datenbank scannen und alle Umbenennungsbefehle puffern. Nehmen Sie dann die Codeänderung vor und führen Sie sofort die Umbenennungsbefehle auf einmal aus.
- Cluster-Unterstützung verbessern. Derzeit müssen Sie gegen jeden Master-Knoten im Cluster laufen