我注意到ServiceStack Redis的一些事情(事实上已经太晚了)是它在完成它们时不会自动处理它的连接。如果你忘记使用using语句处理它们或者调用dispose(),那么Redis本身就可以将它们计时并去除它们,但这可能需要很长时间才能结束,并且最终会出现荒谬的空闲连接数。 / p>
所以我想知道的是,是否有某种方法可以告诉垃圾收集器自动处理连接以防万一。
答案 0 :(得分:1)
Redis客户端封装了一个TCP连接,在完成使用后需要明确处理它。如果您使用的是Pooled Redis ClientManager,则只需将客户端返回到池中(即它不会关闭TCP连接)。
如果您访问ServiceStack服务中的base.Redis
属性,它只会在使用时创建,并且会通过使用惰性属性并将其置于服务Dispose()
方法中自动处理,例如:
public class Service
{
private IRedisClient redis;
public virtual IRedisClient Redis
{
get { return redis ?? (redis = RedisManager.GetClient()); }
}
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
}
}
您可以在依赖项中遵循类似的模式,否则您应该使用using语句来确保客户端在使用后始终处置,例如:
using (var redis = redisManager.GetClient())
{
//...
}