Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment réparer les clés Redis sérialisées avec Java

Si vous travaillez avec Java et utilisez Spring, il y a de fortes chances que vos clés dans Redis ressemblent à ceci

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

Les clés dans Redis ne peuvent être que des chaînes, mais Spring vous permet également de stocker des objets Java. Par défaut, Spring convertira l'objet Java à l'aide du sérialiseur JDK. Le sérialiseur JDK ajoute ces \xac\xed... ` octets.

Le correctif consiste généralement en un changement d'une ligne - demandez à spring d'utiliser StringRedisSerializer. Mais ce changement n'affecte que les nouvelles clés. Les clés existantes resteront dans Redis mais seront inaccessibles à Java.

Si vous avez déjà des données en production, vous devez en faire plus. Une approche consiste à renommer les clés et à se débarrasser des données binaires.

Renommer les clés codées Java

Nous avons récemment publié un script java qui corrige automatiquement ces clés. Voir hasshedin/redis-rename-java-encoded-keys.

L'approche générale est :

  1. Scannez les clés et recherchez les clés commençant par \xac\xed\x00\x05 - qui est la signature des objets encodés en Java
  2. Essayez de désérialiser en un objet Java.
  3. En cas de succès, et si l'objet est de type String, renommez la clé
  4. S'il s'agit d'un cluster, renommer la clé ne fonctionnera pas. Dans ce cas, videz et restaurez la clé sous le nouveau nom

L'exécuter en production

  1. Vous devez d'abord modifier le code pour arrêter d'utiliser Jdk Serializer
  2. À ce stade, les lectures à partir de redis échoueront, car le code recherche des objets sérialisés
  3. Commencez maintenant à exécuter le script pour corriger les données

Améliorations futures

  1. Pour réduire les temps d'arrêt, vous pouvez analyser la base de données et mettre en mémoire tampon toutes les commandes de renommage. Ensuite, modifiez le code et exécutez immédiatement les commandes de renommage en une seule fois.
  2. Améliorer la prise en charge des clusters. Actuellement, vous devez exécuter sur chaque nœud maître du cluster