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 einesusing
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 derIRedisClientsManager
Fabrik) - Verwenden Sie niemals denselben Redis-Client in mehreren Threads, d. h. lassen Sie jeden Thread seinen eigenen Client von der Factory auflösen