sql >> Database >  >> NoSQL >> Redis

Hoe Redis-sleutels in serie met Java te repareren

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:

  1. Scan sleutels en zoek naar sleutels die beginnen met \xac\xed\x00\x05 - wat de handtekening is voor Java-gecodeerde objecten
  2. Probeer te deserialiseren naar een Java-object.
  3. Indien succesvol, en als het object van het type String is, hernoem dan de sleutel
  4. Als het een cluster is, werkt de hernoemingssleutel niet. Dump en herstel in dat geval de sleutel onder de nieuwe naam

In productie draaien

  1. U moet eerst de code wijzigen om te stoppen met het gebruik van Jdk Serializer
  2. Op dit punt zullen het lezen van redis mislukken, omdat de code op zoek is naar geserialiseerde objecten
  3. Start nu het script om de gegevens te corrigeren

Toekomstige verbeteringen

  1. 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.
  2. Clusterondersteuning verbeteren. Momenteel moet u tegen elk hoofdknooppunt in het cluster lopen

  1. java.lang.IncompatibleClassChangeError:klasse Mongo implementeren

  2. Vind de totale tijd besteed door een gebruiker in mongoDB

  3. MongoDB.Driver.Builders hoe te groeperen en gemiddeld te krijgen

  4. Wat is het verschil tussen ReplaceOne() en updateOne() in MongoDB?