multithreading - 如何在多线程环境下正确使用redis和servicestack?

标签 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
}

最佳答案

请阅读 proper usage of Redis Client Manager 上的文档它只能用作单例。

BasicRedisClientManager 没有任何连接池,因此每次调用 GetClient() 时,您都会与 redis 服务器打开一个新的 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
    }
}

“未知命令角色”错误是由于使用旧版本的 Redis 服务器造成的。 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

关于multithreading - 如何在多线程环境下正确使用redis和servicestack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34129853/

相关文章:

java - 在Java中创建另一个任务时取消当前任务并重用同一线程

angularjs - Express/Passport 本地认证多台服务器

events - 使用 ServiceStack.Redis 存储对象时自动检测

url-routing - 路由可以以变量开头吗?

c# - 使用两个参数启动线程

c++ - 如何在 C++ 中将 std::thread::id 转换为字符串?

java - 绝地武士获取数据 : JedisConnectionFailureException iterating a section of code over long period of time

php - "Refresh cache"在 Magento 中是什么意思?

c# - ServiceStack 请求绑定(bind)异常

c++ - 这段代码是线程安全的吗?