Om du arbetar med Java och använder Spring, finns det en rimlig chans att dina nycklar i Redis ser ut så här
\xac\xed\x00\x05t\x00\x0amyrediskey
Nycklar i Redis kan bara vara strängar, men Spring låter dig lagra java-objekt också. Som standard kommer Spring att konvertera java-objektet med JDK serializer. JDK serializer lägger till dessa \xac\xed...
` bytes.
Fixeringen är vanligtvis en 1-rads förändring - instruera våren att använda StringRedisSerializer. Men denna förändring påverkar bara nya nycklar. Befintliga nycklar kommer att fortsätta att finnas kvar i Redis men kommer att vara otillgängliga för java.
Om du redan har data i produktionen måste du göra mer. Ett tillvägagångssätt är att byta namn på nycklar och bli av med binära data.
Byt namn på Java-kodade nycklar
Vi släppte nyligen ett java-skript som automatiskt fixar sådana nycklar. Se hashedin/redis-rename-java-encoded-keys.
Det allmänna tillvägagångssättet är:
- Skanna nycklar och leta efter nycklar som börjar med
\xac\xed\x00\x05
- som är signaturen för java-kodade objekt - Försök att deserialisera till ett java-objekt.
- Om det lyckas och om objektet är av typen String, byt namn på nyckeln
- Om det är ett kluster fungerar inte byta namn på nyckeln. I så fall, dumpa och återställa nyckeln under det nya namnet
Köra den i produktion
- Du måste först göra kodändringen för att sluta använda Jdk Serializer
- Vid denna tidpunkt kommer läsning från redis att misslyckas, eftersom koden letar efter serialiserade objekt
- Börja nu köra skriptet för att korrigera data
Framtida förbättringar
- För att minska driftstopp kan du skanna databasen och buffra alla kommandon för att ändra namn. Gör sedan kodändringen och kör omedelbart namnbytningskommandona på en gång.
- Förbättra klusterstödet. För närvarande måste du köra mot varje huvudnod i klustret