/// <summary> /// Returns a socket to the pool. /// If the socket is dead, it will be destroyed. /// If there are more than MaxPoolSize sockets in the pool, it will be destroyed. /// If there are less than MinPoolSize sockets in the pool, it will always be put back. /// If there are something inbetween those values, the age of the socket is checked. /// If it is older than the SocketRecycleAge, it is destroyed, otherwise it will be /// put back in the pool. /// </summary> internal void Return(MSocket socket) { //If the socket is dead, destroy it. if (!socket.IsAlive || hasDisponse) { Interlocked.Increment(ref DeadSocketsOnReturn); socket.Close(); } else { //Clean up socket socket.Reset(); //Check pool size. if (socketQueue.Count >= maxQueue) { //If the pool is full, destroy the socket. socket.Close(); } else if (socketQueue.Count > minQueue && socket.CreateTime.AddMinutes(30) < DateTime.Now) { //socket 服务超过半小时的,也可以休息了,只保留最底个数。 //If we have more than the minimum amount of sockets, but less than the max, and the socket is older than the recycle age, we destroy it. socket.Close(); } else { //Put the socket back in the pool. lock (socketQueue) { socketQueue.Enqueue(socket); } } } }
/// <summary> /// Returns a socket to the pool. /// If the socket is dead, it will be destroyed. /// If there are more than MaxPoolSize sockets in the pool, it will be destroyed. /// If there are less than MinPoolSize sockets in the pool, it will always be put back. /// If there are something inbetween those values, the age of the socket is checked. /// If it is older than the SocketRecycleAge, it is destroyed, otherwise it will be /// put back in the pool. /// </summary> internal void Return(MSocket socket) { //If the socket is dead, destroy it. if (!socket.IsAlive) { Interlocked.Increment(ref deadsocketsonreturn); socket.Close(); } else { //Clean up socket if (socket.Reset()) { Interlocked.Increment(ref dirtysocketsonreturn); } //Check pool size. if (queue.Count >= owner.MaxPoolSize) { //If the pool is full, destroy the socket. socket.Close(); } else if (queue.Count > owner.MinPoolSize && DateTime.Now - socket.Created > owner.SocketRecycleAge) { //If we have more than the minimum amount of sockets, but less than the max, and the socket is older than the recycle age, we destroy it. socket.Close(); } else { //Put the socket back in the pool. lock (queue) { queue.Enqueue(socket); } } } }
public RedisCommand(MSocket socket) { this.socket = socket; socket.Reset(); }