Отстраняване на грешки при проблеми с повреда на данните #
Проблем, който може да бъде труден за отстраняване на грешки, е ако същият 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 в множество нишки, т.е. накарайте всяка нишка да разреши собствен клиент от фабриката