Redis
 sql >> Database >  >> NoSQL >> Redis

Come risolvere le chiavi Redis serializzate con Java

Se lavori con Java e usi Spring, ci sono buone probabilità che le tue chiavi in ​​Redis assomiglino a questa

\xac\xed\x00\x05t\x00\x0amyrediskey

Le chiavi in ​​Redis possono essere solo stringhe, ma Spring ti consente anche di memorizzare oggetti java. Per impostazione predefinita, Spring convertirà l'oggetto java utilizzando il serializzatore JDK. Il serializzatore JDK aggiunge quei \xac\xed... ` byte.

La correzione è in genere una modifica di 1 riga:indica a Spring di utilizzare StringRedisSerializer. Ma questa modifica riguarda solo le nuove chiavi. Le chiavi esistenti continueranno a rimanere in Redis ma non saranno accessibili a Java.

Se hai già dati in produzione, devi fare di più. Un approccio consiste nel rinominare le chiavi ed eliminare i dati binari.

Rinomina chiavi codificate Java

Di recente abbiamo rilasciato uno script java che corregge automaticamente tali chiavi. Vedi hashedin/redis-rename-java-encoded-keys.

L'approccio generale è:

  1. Scansiona le chiavi e cerca le chiavi che iniziano con \xac\xed\x00\x05 - che è la firma per gli oggetti con codifica java
  2. Prova a deserializzare in un oggetto java.
  3. Se ha esito positivo e se l'oggetto è di tipo String, rinomina la chiave
  4. Se si tratta di un cluster, la chiave di ridenominazione non funzionerà. In tal caso, scarica e ripristina la chiave con il nuovo nome

Eseguirlo in produzione

  1. Devi prima modificare il codice per interrompere l'utilizzo di Jdk Serializer
  2. A questo punto, le letture da redis falliranno, perché il codice sta cercando oggetti serializzati
  3. Ora inizia a eseguire lo script per correggere i dati

Miglioramenti futuri

  1. Per ridurre i tempi di inattività, è possibile eseguire la scansione del database e memorizzare nel buffer tutti i comandi di ridenominazione. Quindi apporta la modifica del codice ed esegui immediatamente i comandi di ridenominazione in una volta sola.
  2. Migliora il supporto del cluster. Attualmente, devi eseguire su ogni nodo master nel cluster