sql >> Databáze >  >> NoSQL >> Redis

Odstraňování problémů

Ladění problémů s poškozením dat #

Problém, který může být obtížné ladit, je, pokud je stejný RedisClient instance je sdílena mezi více vlákny, což může vést k vrácení poškozených dat. Obvykle je to výsledek použití IRedisClient pole v jediné instanci nebo jej sdílet jako statickou instanci. Abyste tomu zabránili, každé vlákno, které používá Redis, by mělo načíst klienta redis v příkazu using, např.:

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

Bohužel stránka volání, která vrací poškozenou odpověď nebo výjimku za běhu, neidentifikuje, kde jinde byla instance klienta Redis používána. Abyste pomohli identifikovat, kde se používají instance klienta, můžete potvrdit, že klient je používán pouze ve vláknu, které jej vyřešilo z fondu pomocí:

RedisConfig.AssertAccessOnlyOnSameThread = true;

Toto zachytí Thread's StackTrace pokaždé, když je klient vyřešen z fondu, což by mělo být povoleno pouze při ladění problémů s připojením, protože to přidává spoustu režie.

Pokud zjistí, že se ke klientovi přistupuje z jiného vlákna, vyvolá InvalidAccessException se zprávou obsahující různá ID vláken a původní StackTrace kde byl klient vyřešen z bazénu. Můžete to porovnat se StackTrace of the Exception, abyste snad identifikovali, kde je klient nesprávně používán.

Předcházení problémům se souběžným používáním #

Na co si dát pozor ve své kódové základně, abyste zabránili vícenásobnému současnému použití IRedisClient instance:

  • Použijte IRedisClient klient instance redis v rámci using prohlášení
  • Nikdy nepoužívejte instanci klienta poté, co byla zlikvidována
  • Nikdy nepoužívejte (ani nevracejte) „sbírku serveru nebo zdroj“ (např. Redis.Lists, zámek) poté, co byl klient zlikvidován
  • Nikdy nenechávejte Singleton nebo static instance do klienta redis (pouze IRedisClientsManager továrna)
  • Nikdy nepoužívejte stejného klienta redis ve více vláknech, to znamená, že každé vlákno musí z výroby vyřešit svého vlastního klienta

  1. MongoDB $ceil

  2. MongoDB $atan

  3. Jak vytvořit schéma Mongoose s polem ID objektů?

  4. Pomocí sad Redis