Redis
 sql >> база данни >  >> NoSQL >> Redis

Отстраняване на проблеми

Отстраняване на грешки при проблеми с повреда на данните #

Проблем, който може да бъде труден за отстраняване на грешки, е ако същият RedisClient екземплярът се споделя в множество нишки, което може да доведе до връщане на повредени данни. Обикновено това е резултат от използването на IRedisClient поле в единичен екземпляр или споделянето му като статичен екземпляр. За да предотврати това, всяка нишка, която използва Redis, трябва да извлече клиента на redis в рамките на израз за използване, напр.:

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

За съжаление сайтът за повикване, който връща повредения отговор или изключение по време на изпълнение, не идентифицира къде другаде е бил използван клиентският екземпляр на Redis. За да помогнете да идентифицирате къде се използват клиентски екземпляри, можете да твърдите, че клиентът се използва само в нишката, която го е разрешила от пула с:

RedisConfig.AssertAccessOnlyOnSameThread = true;

Това улавя StackTrace на нишката всеки път, когато клиентът бъде разрешен от пула, което, тъй като добавя много режийни разходи, трябва да се активира само при отстраняване на грешки при проблеми с връзката.

Ако открие, че клиентът е достъпен от друга нишка, ще изведе InvalidAccessException със съобщението, съдържащо различните идентификатори на нишки и оригиналният StackTrace където клиентът беше решен от пула. Можете да сравните това със StackTrace на изключението, за да се надяваме, че идентифицирате къде клиентът се използва неправилно.

Избягване на проблеми с едновременното използване #

Какво да внимавате във вашата кодова база, за да предотвратите многократно едновременно използване на IRedisClient пример:

  • Използвайте IRedisClient redis клиент на екземпляр в рамките на using изявление
  • Никога не използвайте клиентски екземпляр, след като е бил изхвърлен
  • Никога не използвайте (или не връщайте) „сървърна колекция или ресурс“ (напр. Redis.Lists, заключване), след като клиентът е бил изхвърлен
  • Никога не поддържайте Singleton или static екземпляр към клиент на redis (само IRedisClientsManager фабрика)
  • Никога не използвайте един и същ клиент на redis в множество нишки, т.е. накарайте всяка нишка да разреши собствен клиент от фабриката

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. redis slave няма да се синхронизира с master

  2. Django Celery получава брой задачи

  3. Свържете се с redis от друг контейнер в docker

  4. Как да получите всички ключове от Redis с помощта на шаблона Redis

  5. Как да използвам redis за съхранение на йерархични данни?