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

Dépannage des problèmes

Débogage des problèmes de corruption de données #

Un problème qui peut être difficile à déboguer est si le même RedisClient l'instance est partagée sur plusieurs threads, ce qui peut entraîner le retour de données corrompues. Généralement, cela résulte de l'utilisation de IRedisClient champ dans une instance singleton ou en le partageant en tant qu'instance statique. Pour éviter cela, chaque Thread qui utilise Redis doit récupérer le client Redis dans une instruction using, par exemple :

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

Malheureusement, le site d'appel qui renvoie la réponse corrompue ou l'exception d'exécution n'identifie pas où l'instance du client Redis était utilisée. Pour vous aider à identifier où les instances client sont utilisées, vous pouvez affirmer que le client n'est utilisé que dans le thread qui l'a résolu à partir du pool avec :

RedisConfig.AssertAccessOnlyOnSameThread = true;

Cela capture le StackTrace du Thread chaque fois que le client est résolu à partir du pool, ce qui, comme il ajoute beaucoup de temps système, ne doit être activé que lors du débogage des problèmes de connexion.

S'il détecte que le client est accessible à partir d'un thread différent, il lancera une InvalidAccessException avec le message contenant les différents Thread Ids et le StackTrace d'origine où le client a été résolu à partir du pool. Vous pouvez comparer cela avec le StackTrace de l'exception pour, espérons-le, identifier où le client est mal utilisé.

Éviter les problèmes d'utilisation simultanée #

Ce qu'il faut rechercher dans votre base de code pour éviter l'utilisation simultanée multiple d'un IRedisClient instance :

  • Utiliser IRedisClient client d'instance redis dans un using déclaration
  • N'utilisez jamais une instance client après sa suppression
  • Ne jamais utiliser (ou renvoyer) une "collection ou ressource de serveur" (par exemple, Redis.Lists, verrou) après la suppression du client
  • Ne gardez jamais un Singleton ou un static instance à un client redis (juste le IRedisClientsManager usine)
  • N'utilisez jamais le même client Redis dans plusieurs threads, c'est-à-dire que chaque thread résout son propre client depuis l'usine