Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como corrigir chaves Redis serializadas com Java


Se você trabalha com Java e usa Spring, há uma boa chance de suas chaves no Redis ficarem assim

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

As chaves no Redis só podem ser Strings, mas o Spring também permite armazenar objetos Java. Por padrão, o Spring converterá o objeto java usando o serializador JDK. O serializador JDK adiciona aqueles \xac\xed... ` bytes.

A correção geralmente é uma alteração de 1 linha - instrua o spring a usar StringRedisSerializer. Mas essa alteração afeta apenas novas chaves. As chaves existentes continuarão no Redis, mas ficarão inacessíveis ao java.

Se você já tem dados em produção, precisa fazer mais. Uma abordagem é renomear as chaves e se livrar dos dados binários.

Renomear chaves codificadas Java


Recentemente, lançamos um script java que corrige automaticamente essas chaves. Consulte hashedin/redis-rename-java-encoded-keys.

A abordagem geral é:
  1. Digitalizar chaves e procurar chaves que comecem com \xac\xed\x00\x05 - que é a assinatura para objetos codificados em Java
  2. Tente desserializar em um objeto Java.
  3. Se for bem-sucedido e se o objeto for do tipo String, renomeie a chave
  4. Se for um cluster, renomear a chave não funcionará. Nesse caso, despeje e restaure a chave com o novo nome

Executando em produção

  1. Primeiro você precisa fazer a alteração do código para parar de usar o Jdk Serializer
  2. Neste ponto, as leituras do redis falharão, porque o código está procurando por objetos serializados
  3. Agora comece a executar o script para corrigir os dados

Melhorias futuras

  1. Para reduzir o tempo de inatividade, você pode varrer o banco de dados e armazenar em buffer todos os comandos de renomeação. Em seguida, faça a alteração do código e execute imediatamente os comandos de renomeação de uma só vez.
  2. Melhore o suporte a clusters. Atualmente, você precisa executar em cada nó mestre no cluster