2015-10-06 100 views
0

我在ServiceStack Redis中注意到的一点(无可否认,这太迟了)是它在完成配置时不会自动处理它的连接。如果您忘记使用using语句或调用dispose()来处理它们,则Redis本身会将其排除并将其清除,但这可能需要很长时间,最终可能会产生可笑的空闲连接数。自动配置Redis连接

所以我想知道的是,如果有一些方法来告诉垃圾收集自动处理连接以防万一。

回答

0

Redis客户端封装了一个TCP连接,它在完成使用后需要明确处理。如果您使用的是Pooled Redis ClientManager,则只会将客户端返回到池中(即,它不会关闭TCP连接)。

如果访问base.Redis财产在你ServiceStack服务时,它的使用,而且得到通过使用一个懒惰的财产和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()) 
{ 
    //... 
} 
+0

也许这是一个.NET的功能,我不知道,但什么是ServiceStack Serv冰?另外,我不确定你从哪里获得RedisManager。 – PointlessSpike

+0

它是[ServiceStack](https://servicestack.net)'Service'类。您可以使用任何[Redis Client Manager](https://github.com/ServiceStack/ServiceStack.Redis#redis-client-managers)来解析Redis客户端。 RedisManager只是'IRedisClientsManager'的一个实例,你可以在[LogicBase](https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/ILogic.cs#L57)类中找到一个完整的例子。 – mythz

+0

这应该是从那时起继承的吗?否则将不会调用Dispose。 – PointlessSpike