Debugowanie problemów z uszkodzeniem danych #
Problem, który może być trudny do debugowania, polega na tym, że ten sam RedisClient
instancja jest współużytkowana przez wiele wątków, co może skutkować zwróceniem uszkodzonych danych. Zazwyczaj jest to wynikiem użycia IRedisClient
pole w pojedynczej instancji lub udostępniając je jako instancję statyczną. Aby temu zapobiec, każdy wątek, który używa Redis, powinien pobrać klienta redis w instrukcji using, np.:
using var redis = redisManager.GetClient();
//...
Niestety witryna wywołania, która zwraca uszkodzoną odpowiedź lub wyjątek środowiska wykonawczego, nie identyfikuje, gdzie jeszcze była używana instancja klienta Redis. Aby pomóc określić, gdzie używane są instancje klienta, możesz zapewnić, że klient jest używany tylko w wątku, który go rozwiązał z puli za pomocą:
RedisConfig.AssertAccessOnlyOnSameThread = true;
Przechwytuje StackTrace wątku za każdym razem, gdy klient jest rozwiązywany z puli, co ponieważ zwiększa obciążenie, powinno być włączone tylko podczas debugowania problemów z połączeniem.
Jeśli wykryje, że klient uzyskuje dostęp z innego wątku, zgłosi InvalidAccessException
z wiadomością zawierającą różne identyfikatory wątków i oryginalny StackTrace gdzie klient został rozwiązany z puli. Możesz porównać to ze StackTrace wyjątku, aby miejmy nadzieję zidentyfikować, gdzie klient jest niewłaściwie używany.
Unikanie problemów związanych ze współbieżnym użytkowaniem #
Na co zwrócić uwagę w swojej bazie kodu, aby zapobiec wielokrotnemu równoczesnemu użyciu IRedisClient
przykład:
- Użyj
IRedisClient
redis klienta instancji wusing
oświadczenie - Nigdy nie używaj instancji klienta po jej usunięciu
- Nigdy nie używaj (ani nie zwracaj) „kolekcji serwera lub zasobu” (np. Redis.Lists, lock) po usunięciu klienta
- Nigdy nie trzymaj Singletona lub
static
wystąpienie do klienta redis (tylkoIRedisClientsManager
fabryka) - Nigdy nie używaj tego samego klienta redis w wielu wątkach, tj. każdy wątek powinien rozwiązywać własnego klienta z fabryki