C# 自动处理Redis连接
我注意到ServiceStack Redis的一点(承认为时已晚)是,它不会在完成连接后自动处理连接。如果您忘记使用using语句或调用dispose()处理它们,则由Redis自己超时并清除它们,但这可能需要很长时间,最终可能导致大量空闲连接C# 自动处理Redis连接,c#,redis,
servicestack,C#,Redis,
servicestack,我注意到ServiceStack Redis的一点(承认为时已晚)是,它不会在完成连接后自动处理连接。如果您忘记使用using语句或调用dispose()处理它们,则由Redis自己超时并清除它们,但这可能需要很长时间,最终可能导致大量空闲连接 所以我想知道的是,是否有某种方法可以告诉垃圾收集自动处理连接,以防万一。Redis客户端封装了一个TCP连接,在您使用完它之后,确实需要显式地处理它。如果您使用的是TCP连接,则只会将客户端返回到池中(即,它不会关闭TCP连接) 如果访问ServiceS
所以我想知道的是,是否有某种方法可以告诉垃圾收集自动处理连接,以防万一。Redis客户端封装了一个TCP连接,在您使用完它之后,确实需要显式地处理它。如果您使用的是TCP连接,则只会将客户端返回到池中(即,它不会关闭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())
{
//...
}
也许这是我不知道的.Net特性,但什么是ServiceStack服务?另外,我不确定你从哪里得到RedisManager。它是
服务类。您可以使用any来解析Redis客户端。RedisManager只是IRediclientsManager
的一个实例,您可以在类中找到一个完整的示例。这应该是从类继承的吗?否则将不会调用Dispose。这只是一个普通的依赖类,如果使用IOC,它将在请求结束时被释放。如果您没有使用IOC,请忘记它,在using语句中使用它,并显式地处理它,即如何处理需要处理的任何其他资源。