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

Solución de problemas

Depuración de problemas de corrupción de datos #

Un problema que puede ser difícil de depurar es si el mismo RedisClient la instancia se comparte entre varios subprocesos, lo que puede provocar la devolución de datos dañados. Por lo general, esto es el resultado de usar IRedisClient campo en una instancia singleton o compartirlo como una instancia estática. Para evitar esto, cada subproceso que usa Redis debe recuperar el cliente de Redis dentro de una declaración de uso, por ejemplo:

using var redis = redisManager.GetClient();
//...

Desafortunadamente, el sitio de llamada que devuelve la respuesta dañada o la excepción de tiempo de ejecución no identifica dónde más se estaba usando la instancia de cliente de Redis. Para ayudar a identificar dónde se usan las instancias de cliente, puede afirmar que el cliente solo se usa en el subproceso que lo resolvió desde el grupo con:

RedisConfig.AssertAccessOnlyOnSameThread = true;

Esto captura el StackTrace del subproceso cada vez que el cliente se resuelve desde el grupo, lo que, dado que agrega mucha sobrecarga, solo debe habilitarse cuando se depuran problemas de conexión.

Si detecta que se está accediendo al cliente desde un subproceso diferente, generará una InvalidAccessException con el mensaje que contiene los diferentes Id. de subproceso y el StackTrace original donde se resolvió el cliente de la piscina. Puede comparar esto con StackTrace of the Exception para identificar dónde se está utilizando incorrectamente el cliente.

Evitar problemas de uso concurrente #

Qué buscar en su base de código para evitar el uso simultáneo múltiple de un IRedisClient instancia:

  • Usar IRedisClient cliente de instancia redis dentro de un using declaración
  • Nunca use una instancia de cliente después de que se haya eliminado
  • Nunca use (o devuelva) una "colección o recurso de servidor" (por ejemplo, Redis.Lists, bloqueo) después de que el cliente haya sido eliminado
  • Nunca mantengas un Singleton o static instancia a un cliente redis (solo el IRedisClientsManager fábrica)
  • Nunca use el mismo cliente Redis en varios subprocesos, es decir, haga que cada subproceso resuelva su propio cliente de fábrica