public RedisConnection2 GetConnection() { var conn = GetFreeConnection(); if (conn == null) { var queueItem = new GetConnectionQueueItem(); lock (_lock_GetConnectionQueue) GetConnectionQueue.Enqueue(queueItem); if (queueItem.Wait.Wait(TimeSpan.FromSeconds(10))) { return(GetConnection()); } queueItem.IsTimeout = true; throw new Exception("CSRedis.ConnectionPool.GetConnection 连接池获取超时(10秒)"); } if (conn.Client.IsConnected == false || DateTime.Now.Subtract(conn.LastActive).TotalSeconds > 60) { try { conn.Client.Ping(); } catch { ResetConnection(conn); } } conn.ThreadId = Thread.CurrentThread.ManagedThreadId; conn.LastActive = DateTime.Now; Interlocked.Increment(ref conn.UseSum); //Console.WriteLine($"GetConnection: {FreeConnections.Count}/{AllConnections.Count}, {GetConnectionQueue.Count}|{GetConnectionAsyncQueue.Count}"); return(conn); }
public void ReleaseConnection(RedisConnection2 conn, bool isReset = false) { if (isReset) { ResetConnection(conn); } //Console.WriteLine($"ReleaseConnection: {FreeConnections.Count}/{AllConnections.Count}, {GetConnectionQueue.Count}|{GetConnectionAsyncQueue.Count}"); bool isAsync = false; if (GetConnectionAsyncQueue.Count > 0) { TaskCompletionSource <RedisConnection2> tcs = null; lock (_lock_GetConnectionQueue) if (GetConnectionAsyncQueue.Count > 0) { tcs = GetConnectionAsyncQueue.Dequeue(); } if (isAsync = (tcs != null)) { tcs.SetResult(conn); } } if (isAsync == false) { lock (_lock) FreeConnections.Enqueue(conn); while (GetConnectionQueue.Count > 0) { GetConnectionQueueItem queueItem = null; lock (_lock_GetConnectionQueue) if (GetConnectionQueue.Count > 0) { queueItem = GetConnectionQueue.Dequeue(); } if (queueItem != null && queueItem.IsTimeout == false) { queueItem.Wait.Set(); queueItem.Dispose(); break; } if (queueItem != null) { queueItem.Dispose(); } } } }