Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动处理Redis连接_C#_Redis_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,Redis,servicestack" /> servicestack,C#,Redis,servicestack" />

C# 自动处理Redis连接

C# 自动处理Redis连接,c#,redis,servicestack,C#,Redis,servicestack,我注意到ServiceStack Redis的一点(承认为时已晚)是,它不会在完成连接后自动处理连接。如果您忘记使用using语句或调用dispose()处理它们,则由Redis自己超时并清除它们,但这可能需要很长时间,最终可能导致大量空闲连接 所以我想知道的是,是否有某种方法可以告诉垃圾收集自动处理连接,以防万一。Redis客户端封装了一个TCP连接,在您使用完它之后,确实需要显式地处理它。如果您使用的是TCP连接,则只会将客户端返回到池中(即,它不会关闭TCP连接) 如果访问ServiceS

我注意到ServiceStack Redis的一点(承认为时已晚)是,它不会在完成连接后自动处理连接。如果您忘记使用using语句或调用dispose()处理它们,则由Redis自己超时并清除它们,但这可能需要很长时间,最终可能导致大量空闲连接


所以我想知道的是,是否有某种方法可以告诉垃圾收集自动处理连接,以防万一。

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语句中使用它,并显式地处理它,即如何处理需要处理的任何其他资源。