Đôi khi mất nhiều thời gian để mở kết nối với Redis. Có vẻ như nó phụ thuộc vào việc kết nối số lượng và có thể, cấu hình PC. Tôi chạy thử nghiệm cho 50 chủ đề trên hai máy trạm với CPU 4 nhân, và phải mất 70-100ms để mở kết nối, và trên 8-core workstation và 8-core staging server phải mất 1000-1500ms và đôi khi nhiều hơn nữa. Sự phụ thuộc kỳ lạ, nhưng nó có thể tái tạo được. Khi hồ bơi ứng dụng IIS khởi động lại, và tất cả các chuỗi đang cố gắng kết nối lại, nó gây ra một cái gì đó giống như thời gian chết của bộ nhớ cache. Những gì tôi phải thay đổi để có được thời gian kết nối hợp lý?Việc mở lại kết nối lại quá chậm
tôi sử dụng BookSleeve khách hàng, và đây là mẫu mã:
static void Main(string[] args)
{
for (var i = 0; i < threadCount; i++)
threads.Add(new Thread(RunThread));
foreach (var thread in threads)
thread.Start();
foreach (var thread in threads)
thread.Join();
}
static void RunThread()
{
var connection = TryGetConnection();
while (connection == null)
{
connection = TryGetConnection();
}
}
static RedisConnection TryGetConnection()
{
var connection = currentConnection;
if ((connection != null) && (connection.State == RedisConnectionBase.ConnectionState.Open))
return connection;
lock (syncRoot)
{
if ((currentConnection != null) && (currentConnection.State == RedisConnectionBase.ConnectionState.Open))
return currentConnection;
if ((connectionTask != null) && connectionTask.IsCompleted)
connectionTask = null;
if (connectionTask == null)
{
if ((currentConnection != null) && (currentConnection.State == RedisConnectionBase.ConnectionState.Closed))
{
currentConnection.Dispose();
currentConnection = null;
}
if (currentConnection == null)
{
currentConnection = new RedisConnection(
serverAddress,
serverPort,
ioTimeout: (int) operationTimeout.TotalMilliseconds,
syncTimeout: (int) operationTimeout.TotalMilliseconds);
}
if (currentConnection.State == RedisConnectionBase.ConnectionState.New)
currentConnection.Open();
}
}
return null;
}
:) Tôi đã chỉnh sửa bài đăng gốc – MihaKuz
Phiên bản chính xác của sách mà bạn đang sử dụng là gì? Điều này quan trọng, bởi vì lớp IO đã thay đổi khá đáng kể giữa các phiên bản. –
1.3.37, phiên bản mới nhất từ NuGet – MihaKuz