【发布时间】:2019-01-15 21:28:47
【问题描述】:
我正在寻找Redis连接丢失后[在多线程环境中]恢复的参考实现。到目前为止找不到任何有意义的东西。
设置:我有一个 Azure 辅助角色,它在多个线程中运行相同的代码 (ThreadProc)。最初,我有静态 ConnectionMultiplexer 并在每次 Redis 操作之前执行 .GetDatabase() 。那根本没有通过压力测试(一旦负载从低增加到中等,就会出现大量“无法连接”的错误)。我已将其更改为:
static readonly ConnectionMultiplexer _connection = ConnectionMultiplexer.Connect(...);
static readonly IDatabase _cache = _connection.GetDatabase();
void ThreadProc() // running in multiple threads
{
while (true)
{
// using _cache here
}
}
即使在高负载下(每个工作角色实例 1000+ 操作/秒)也能正常工作,直到我得到“没有可用的连接来服务此操作”,此后事情就无法恢复。
请让我知道可以从间歇性连接问题中恢复的正确/推荐代码是什么。
【问题讨论】:
-
我遇到了完全相同的问题(就在我去度假之后,natch)。我的“解决方案”是显而易见且乏味的,用 try/catch 包装对 redis 的每次调用,在每次失败后重新创建连接,然后重试初始操作。还没有从假期回来足够长的时间来看看它是如何工作的:-)。
-
Ken,你是否将每个 _cache.* 调用都包装在 lock() 中?或者如何在多线程环境中安全地重新创建共享连接?
-
在下面查看我的答案。让我知道您是否担心它没有解决的情况。 (很高兴改进我的代码!)
标签: c# redis stackexchange.redis