ฉันคิดว่าวัตถุคงที่ถูกแชร์ผ่านหลายเธรด อย่างไรก็ตาม ฉันประสบปัญหา CPU สูงบนเว็บไซต์หนึ่งของฉัน ดังนั้นฉันจึงทำการถ่ายโอนข้อมูล windbg และประหลาดใจมาก ฉันเห็นสิ่งนี้:
เราจะเห็นได้ว่ามี 10 อินสแตนซ์ของคลาสที่เรียกว่า ConnectionMultiplexer แต่โค้ดของฉันสร้าง ConnectionMultiplexer เป็นวัตถุคงที่ นี่ควรหมายความว่ามีการสร้างอินสแตนซ์เดียวเท่านั้นสำหรับเธรดทั้งหมด แล้วทำไม windbg ถึงแสดงหลายอินสแตนซ์?
นี่คือรหัสของฉันเพื่อสร้างการเชื่อมต่อ Redis
public static class CacheConnection
{
private static StackExchangeRedisCacheClient _newconnectionDb;
public static StackExchangeRedisCacheClient NewConnectionDb
=> _newconnectionDb ?? (_newconnectionDb = NewRedisConnection());
private static IDatabase _connectionDb;
public static IDatabase ConnectionDb => _connectionDb ?? (_connectionDb = RedisConnection());
private static StackExchangeRedisCacheClient NewRedisConnection()
{
var serializer = new NewtonsoftSerializer();
return new StackExchangeRedisCacheClient(Connection, serializer);
}
private static IDatabase RedisConnection()
{
var cacheDatabase = Connection.GetDatabase();
return cacheDatabase;
}
public static ConnectionMultiplexer Connection => LazyConnection.Value;
private static readonly Lazy<ConnectionMultiplexer> LazyConnection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(
System.Configuration.ConfigurationManager.AppSettings["CacheConnectionString"]), LazyThreadSafetyMode.PublicationOnly);
}