Als je met Java werkt en Spring gebruikt, is de kans groot dat je sleutels in Redis er zo uitzien
\xac\xed\x00\x05t\x00\x0amyrediskey
Sleutels in Redis kunnen alleen Strings zijn, maar met Spring kun je ook Java-objecten opslaan. Spring converteert het Java-object standaard met JDK-serializer. De JDK-serializer voegt die \xac\xed...
. toe ` bytes.
De oplossing is meestal een wijziging van één regel - instrueer de lente om StringRedisSerializer te gebruiken. Maar deze wijziging heeft alleen invloed op nieuwe sleutels. Bestaande sleutels blijven in Redis, maar zijn niet toegankelijk voor Java.
Als u al gegevens in productie heeft, moet u meer doen. Een benadering is om sleutels te hernoemen en de binaire gegevens te verwijderen.
De naam van Java-gecodeerde sleutels wijzigen
We hebben onlangs een javascript uitgebracht dat dergelijke sleutels automatisch herstelt. Zie hashedin/redis-rename-java-encoded-keys.
De algemene benadering is:
- Scan sleutels en zoek naar sleutels die beginnen met
\xac\xed\x00\x05
- wat de handtekening is voor Java-gecodeerde objecten - Probeer te deserialiseren naar een Java-object.
- Indien succesvol, en als het object van het type String is, hernoem dan de sleutel
- Als het een cluster is, werkt de hernoemingssleutel niet. Dump en herstel in dat geval de sleutel onder de nieuwe naam
In productie draaien
- U moet eerst de code wijzigen om te stoppen met het gebruik van Jdk Serializer
- Op dit punt zullen het lezen van redis mislukken, omdat de code op zoek is naar geserialiseerde objecten
- Start nu het script om de gegevens te corrigeren
Toekomstige verbeteringen
- Om downtime te verminderen, kunt u de database scannen en alle hernoemopdrachten bufferen. Breng vervolgens de codewijziging aan en voer de hernoemingscommando's meteen in één keer uit.
- Clusterondersteuning verbeteren. Momenteel moet u tegen elk hoofdknooppunt in het cluster lopen