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 umusing
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 oIRedisClientsManager
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