1

我在课堂上为我的 redisclient 使用 servicestack。我有一个 redis 客户端,如下所示:

public class MySuperClass{
    ....        
    RedisClient client = new RedisClient("localhost", 6379);    
    public int MySuperProperty{get; set:}
    ....
}

以下是我如何使用它来确保它在我使用后得到妥善处理:

private void GetInfoFromRedis(object sender, EventArgs e) {
    using (client) {
        client.Set<Human>("RedisKey", new Human { 
            Age = 29,
            Height = 170,
            Name = "HumanName"
            });
        }
    }

我的问题是在我处理之后,client如果我使用相同的处理向 redis 发出另一个请求client,处理的客户端成功地与 redis 数据库建立另一个连接,但这次连接保留在 CLIENT LIST 中。

4

1 回答 1

3

请参阅ServiceStack.Redis 文档以了解使用 ServiceStack Redis Client 的正确用法,即您应该将 Redis ClientManager 用作单例,最好是您在 IOC 中注册的单例,例如:

container.Register<IRedisClientsManager>(c => 
    new RedisManagerPool("localhost:6379"));

然后将其注入您的课程中,例如:

public class MySuperClass
{
    public IRedisClientsManager RedisManager { get; set; }
}

然后您可以在使用中从 Redis ClientManger 解析客户端,例如:

private void GetInfoFromRedis(object sender, EventArgs e) 
{
    using (var client = RedisManager.GetClient()) 
    {
        client.Set<Human>("RedisKey", new Human { 
            Age = 29,
            Height = 170,
            Name = "HumanName"
            });
        }
    }
}

如果您不使用 IOC,您可以在静态属性中填充 IRedisClientsManager,例如:

public class MySuperClass
{
    public static IRedisClientsManager RedisManager = 
        new RedisManagerPool("localhost:6379");
}

但重要的是从 a 解析一个 redis 客户端IRedisClientsManager,然后在立即使用后将其处理掉,例如在 using 语句中:

using (var redis = RedisManager.GetClient()) { ... }
于 2016-07-04T03:40:44.707 回答