如何在多线程环境中正确使用带有servicestack的redis?

时间:2015-12-07 09:05:42

标签: multithreading redis servicestack

我认为我们应该使用basicredisclientmanager或pooledredisclientmanager? 我试过这个

private void dddddd()
{
    for(int i=0;i<=1000;i++)
    {
        var client = new BasicRedisClientManager(new string[] { "host1", "host2", "host3" }).GetClient();
        //do something with client
    }
}

这个循环在第一个100加上运行正常但在那之后,我总是得到一个错误“未知的命令角色”?那是什么以及如何解决它?我需要帮助!

我还尝试创建一个名为MyRedisMgr的新类,并创建了一个静态属性来创建某种单例,但它也不起作用。

public BasicRedisClientManager MyMgr = new BasicRedisClientManager(new string[] { "host1", "host2", "host3" });

然后我就像

一样使用它
for(int i=0;i<=1000;i++)
{
    var client = MyRedisMgr.MyMgr.GetClient();
    //do something with client
}

1 个答案:

答案 0 :(得分:3)

请阅读proper usage of Redis Client Manager上的文档,该文档只能用作单身人士。

BasicRedisClientManager没有任何连接池,因此每次拨打GetClient()时,您都会使用redis-server打开新的TCP连接。除非您了解应该使用其中一个池化Redis客户端管理器的含义,例如:RedisManagerPool

您还需要在使用客户端之后始终处置它,以便可以重复使用它或正确处理TCP连接。

因此,您的代码示例应如下所示:

//Always use the same singleton instance of a Client Manager
var redisManager = new RedisManagerPool(masterHost);

for(int i=0;i<=1000;i++)
{
    using (var redis = redisManager.GetClient())
    {
        //do something with client
    }
}

&#34;未知命令角色&#34;错误是由于使用旧版本的Redis Server。 ROLE命令已在redis 2.8.12中添加,但此API应为only be used if your using redis-server v2.8.12+,因此默认情况下您不应该收到此错误。您可以通过升级到具有此命令的stable v3.0 or old 2.8 versions of redis-server来避免此错误。

如果您想继续使用旧版本,请使用INFO命令检查您正在运行的版本,然后告诉ServiceStack.Redis版本的用途:

RedisConfig.AssumeServerVersion = 2600; //e.g. v2.6
RedisConfig.AssumeServerVersion = 2612; //e.g. v2.6.12