Hvis du arbejder med Java og bruger Spring, er der en rimelig chance for, at dine nøgler i Redis ser sådan ud
\xac\xed\x00\x05t\x00\x0amyrediskey
Nøgler i Redis kan kun være strenge, men Spring lader dig også gemme java-objekter. Som standard vil Spring konvertere java-objektet ved hjælp af JDK serializer. JDK serializer tilføjer disse \xac\xed...
` bytes.
Rettelsen er normalt en 1-linjes ændring - instruer foråret om at bruge StringRedisSerializer. Men denne ændring påvirker kun nye nøgler. Eksisterende nøgler vil fortsat forblive i Redis, men vil være utilgængelige for java.
Hvis du allerede har data i produktionen, skal du gøre mere. En tilgang er at omdøbe nøgler og slippe af med de binære data.
Omdøb Java-kodede nøgler
Vi har for nylig udgivet et java-script, der automatisk retter sådanne nøgler. Se hashedin/redis-rename-java-encoded-keys.
Den generelle tilgang er:
- Scan nøgler, og se efter nøgler, der starter med
\xac\xed\x00\x05
- som er signaturen for java-kodede objekter - Prøv at deserialisere til et java-objekt.
- Hvis det lykkes, og hvis objektet er af typen String, så omdøb nøglen
- Hvis det er en klynge, vil omdøbningsnøgle ikke virke. I så fald skal du dumpe og gendan nøglen under det nye navn
Køre det i produktion
- Du skal først foretage kodeændringen for at stoppe med at bruge Jdk Serializer
- På dette tidspunkt vil læsning fra redis mislykkes, fordi koden leder efter serialiserede objekter
- Begynd nu at køre scriptet for at rette dataene
Fremtidige forbedringer
- For at reducere nedetiden kan du scanne databasen og buffere alle omdøbningskommandoer. Foretag derefter kodeændringen og kør straks omdøbningskommandoerne på én gang.
- Forbedre klyngeunderstøttelse. I øjeblikket skal du køre mod hver masterknude i klyngen