Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Rozwiązywanie problemów

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 w using 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 (tylko IRedisClientsManager 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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Używanie StackExchange.Redis w kontrolerze ASP.NET Core

  2. Sprawdź, czy działa redis -> węzeł js

  3. Jak zainstalować Redis

  4. Redis Expire nie działa

  5. json.loads i Redis w Pythonie 3.5