首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackExchange.Redis超时和“没有可用的连接来服务此操作”

StackExchange.Redis超时和“没有可用的连接来服务此操作”
EN

Stack Overflow用户
提问于 2014-04-08 07:52:45
回答 1查看 38.7K关注 0票数 45

我在我们的生产环境中有以下问题(Web-Found-4节点,最上面的负载均衡器):

1) Timeout performing HGET key, inst: 3, queue: 29, qu=0, qs=29, qc=0, wr=0/0 at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor``1 processor, ServerEndPoint server) in ConnectionMultiplexer.cs:line 1699这种情况立即发生3-10次。

2) No connection is available to service this operation: HGET key at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor``1 processor, ServerEndPoint server) in ConnectionMultiplexer.cs:line 1666

我试着按照Marc的建议来实现(也许我对它的解释不正确)--与Redis的连接比多个更好。我做了以下的实现:

代码语言:javascript
复制
public class SeRedisConnection
{
    private static ConnectionMultiplexer _redis;

    private static readonly object SyncLock = new object();

    public static IDatabase GetDatabase()
    {
        if (_redis == null || !_redis.IsConnected || !_redis.GetDatabase().IsConnected(default(RedisKey)))
        {
            lock (SyncLock)
            {
                try
                {
                    var configurationOptions = new ConfigurationOptions
                    {
                        AbortOnConnectFail = false
                    };
                    configurationOptions.EndPoints.Add(new DnsEndPoint(ConfigurationHelper.CacheServerHost,
                        ConfigurationHelper.CacheServerHostPort));

                    _redis = ConnectionMultiplexer.Connect(configurationOptions);
                }
                catch (Exception ex)
                {
                   IoC.Container.Resolve<IErrorLog>().Error(ex);
                    return null;
                }
            }
        }
        return _redis.GetDatabase();
    }

    public static void Dispose()
    {
        _redis.Dispose();
    }
}

实际上现在还没有使用过。此外,我还有一些具体的实现,这些实现可能导致这样的行为(我只使用散列):1.添加、删除散列-异步2.获取-sync

有人能帮我避免这种行为吗?

提前谢谢!

解决了-在评估网络能力之后增加了客户端连接超时。

更新2:实际上它并没有解决问题。当缓存容量开始增加时,例如从2GB开始。然后我看到了同样的模式,实际上这些超时大约每5分钟就会发生一次。我们的网站每隔5分钟就被冻结一段时间,直到分叉手术结束。然后,我发现有一个选项可以每x秒制作一个叉(保存到磁盘):

代码语言:javascript
复制
save 900 1
save 300 10
save 60 10000

在我的例子中,它是“保存300 10”--如果至少发生10次更新,每5分钟保存一次。我还发现“叉子”可能很贵。注释“保存”部分根本解决了问题。我们可以评论“保存”部分,因为我们只使用Redis作为“缓存在内存”-我们不需要任何坚持。以下是我们的缓存服务器“Redis2.4.6”窗口端口的配置:https://github.com/rgl/redis/downloads

也许在MSOpentech:http://msopentech.com/blog/2013/04/22/redis-on-windows-stable-and-reliable/中的Redis端口的最新版本中已经解决了这个问题,但我还没有进行测试。

无论如何,StackExchange.Redis与这个问题无关,在我们的生产环境中,它的工作非常稳定,这要感谢Marc。

最终更新: Redis是单线程解决方案--它最终是快速的,但是当涉及到释放内存(删除陈旧或过期的项)时,出现问题的原因是一个线程应该回收内存(这不是快速操作--不管使用什么算法),并且同一个线程应该处理GET、SET操作。当然,当我们谈到中等负荷的生产环境时,就会发生这种情况。即使在达到内存障碍时使用带有从节点的群集,它也会有相同的行为。

EN

回答 1

Stack Overflow用户

发布于 2018-11-11 06:54:08

在大多数情况下,这个异常都是客户端问题。早期版本的StackExchange.Redis直接使用Win32套接字,有时会产生负面影响。可能Asp.net内部路由以某种方式与之相关。

好消息是StackExchange.Redis. infra的网络最近被彻底改写了。最后一个版本是2.0.513。试一试,你的问题就很有可能解决。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22930856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档