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

Solução de problemas

Depurando problemas de corrupção de dados #


Um problema que pode ser difícil de depurar é se o mesmo RedisClient instância é compartilhada em vários threads, o que pode resultar no retorno de dados corrompidos. Normalmente, isso é resultado do uso de IRedisClient campo em uma instância singleton ou compartilhando-o como uma instância estática. Para evitar isso, cada Thread que usa Redis deve recuperar o cliente redis em uma instrução using, por exemplo:
using var redis = redisManager.GetClient();
//...

Infelizmente, o site de chamada que retorna a resposta corrompida ou a exceção de tempo de execução não identifica onde mais a instância do cliente Redis estava sendo usada. Para ajudar a identificar onde as instâncias do cliente estão sendo usadas, você pode afirmar que o cliente é usado apenas no Thread que o resolveu do pool com:
RedisConfig.AssertAccessOnlyOnSameThread = true;

Isso captura o StackTrace do Thread cada vez que o cliente é resolvido a partir do pool, o que, como adiciona muita sobrecarga, deve ser ativado apenas ao depurar problemas de conexão.

Se detectar que o cliente está sendo acessado de um thread diferente, ele lançará um InvalidAccessException com a mensagem contendo os diferentes IDs de thread e o StackTrace original onde o cliente foi resolvido a partir do pool. Você pode comparar isso com o StackTrace da exceção para identificar onde o cliente está sendo usado incorretamente.

Evitando problemas de uso simultâneo #


O que procurar em sua base de código para evitar o uso simultâneo múltiplo de um IRedisClient instância:
  • Usar IRedisClient cliente de instância redis em um using declaração
  • Nunca use uma instância de cliente depois que ela tiver sido descartada
  • Nunca use (ou devolva) uma "coleção ou recurso de servidor" (por exemplo, Redis.Lists, bloqueio) após o cliente ter sido descartado
  • Nunca mantenha um Singleton ou static instância para um cliente redis (apenas o IRedisClientsManager fábrica)
  • Nunca use o mesmo cliente redis em vários encadeamentos, ou seja, faça com que cada encadeamento resolva seu próprio cliente de fábrica