Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Probleme beheben

Debuggen von Datenbeschädigungsproblemen #

Ein Problem, das schwer zu debuggen sein kann, ist, wenn derselbe RedisClient Instanz wird von mehreren Threads gemeinsam genutzt, was dazu führen kann, dass beschädigte Daten zurückgegeben werden. Normalerweise ist dies ein Ergebnis der Verwendung von IRedisClient Feld in einer Singleton-Instanz oder teilen Sie es als statische Instanz. Um dies zu verhindern, sollte jeder Thread, der Redis verwendet, den Redis-Client innerhalb einer using-Anweisung abrufen, z. B.:

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

Leider gibt die Aufrufseite, die die beschädigte Antwort oder Laufzeitausnahme zurückgibt, nicht an, wo sonst die Redis-Clientinstanz verwendet wurde. Um zu identifizieren, wo Clientinstanzen verwendet werden, können Sie behaupten, dass der Client nur in dem Thread verwendet wird, der ihn aus dem Pool aufgelöst hat, mit:

RedisConfig.AssertAccessOnlyOnSameThread = true;

Dies erfasst den StackTrace des Threads jedes Mal, wenn der Client aus dem Pool aufgelöst wird, was, da es viel Overhead hinzufügt, nur beim Debuggen von Verbindungsproblemen aktiviert werden sollte.

Wenn es erkennt, dass auf den Client von einem anderen Thread aus zugegriffen wird, löst es eine InvalidAccessException aus mit der Nachricht, die die verschiedenen Thread-IDs enthält und das ursprüngliche StackTrace wo der Client aus dem Pool aufgelöst wurde. Sie können dies mit dem StackTrace der Ausnahme vergleichen, um hoffentlich zu erkennen, wo der Client unsachgemäß verwendet wird.

Vermeiden von Problemen bei gleichzeitiger Nutzung #

Worauf Sie in Ihrer Codebasis achten müssen, um die mehrfache gleichzeitige Verwendung eines IRedisClient zu verhindern Beispiel:

  • Verwenden Sie IRedisClient redis-Instanzclient innerhalb eines using Erklärung
  • Verwenden Sie niemals eine Clientinstanz, nachdem sie verworfen wurde
  • Verwende (oder gib) niemals eine "Server-Sammlung oder -Ressource" (z. B. Redis.Lists, Lock) nachdem der Client entsorgt wurde
  • Halten Sie niemals ein Singleton oder static Instanz zu einem Redis-Client (nur der IRedisClientsManager Fabrik)
  • Verwenden Sie niemals denselben Redis-Client in mehreren Threads, d. h. lassen Sie jeden Thread seinen eigenen Client von der Factory auflösen