sql >> Base de Datos >  >> NoSQL >> Redis

Cómo arreglar claves Redis serializadas con Java

Si trabaja con Java y usa Spring, es muy probable que sus claves en Redis se vean así

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

Las claves en Redis solo pueden ser cadenas, pero Spring también le permite almacenar objetos Java. De forma predeterminada, Spring convertirá el objeto Java utilizando el serializador JDK. El serializador JDK agrega esos \xac\xed... ` bytes.

La solución suele ser un cambio de 1 línea:indique a Spring que use StringRedisSerializer. Pero este cambio solo afecta a las claves nuevas. Las claves existentes seguirán estando en Redis, pero Java no podrá acceder a ellas.

Si ya tiene datos en producción, necesita hacer más. Un enfoque es cambiar el nombre de las claves y deshacerse de los datos binarios.

Renombrar claves codificadas de Java

Recientemente lanzamos un script Java que corrige automáticamente dichas claves. Consulte hashedin/redis-rename-java-encoded-keys.

El enfoque general es:

  1. Escanear claves y buscar claves que comiencen con \xac\xed\x00\x05 - que es la firma para objetos codificados en java
  2. Intente deserializar en un objeto Java.
  3. Si tiene éxito, y si el objeto es de tipo Cadena, cambie el nombre de la clave
  4. Si se trata de un clúster, la clave de cambio de nombre no funcionará. En ese caso, descargue y restaure la clave con el nuevo nombre

Ejecutarlo en producción

  1. Primero debe cambiar el código para dejar de usar Jdk Serializer
  2. En este punto, las lecturas de redis fallarán porque el código está buscando objetos serializados
  3. Ahora comience a ejecutar el script para corregir los datos

Mejoras futuras

  1. Para reducir el tiempo de inactividad, puede escanear la base de datos y almacenar en búfer todos los comandos de cambio de nombre. Luego cambie el código e inmediatamente ejecute los comandos de cambio de nombre de una sola vez.
  2. Mejorar la compatibilidad con clústeres. Actualmente, debe ejecutar contra cada nodo maestro en el clúster