servicestack.redis,redisclient,Redis,servicestack.redis,Redisclient" /> servicestack.redis,redisclient,Redis,servicestack.redis,Redisclient" />

GetClient调用上的Redis超时过期消息

GetClient调用上的Redis超时过期消息,redis,servicestack.redis,redisclient,Redis,servicestack.redis,Redisclient,我讨厌那些“信息不足”的问题。所以我会尽量提供详细的信息。在这种情况下,它是代码 服务器: 64位的 有三类: DbOperationContext.cs: PerRequestLifeTimeManager.cs: RedisRepository.cs 我们正在统一使用Redis 在这种情况下,我们得到了一个奇怪的信息: “Redis超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用中。” 我们检查了这些: 问题是配置问题 我们是否使用了错误的RedisServer.

我讨厌那些“信息不足”的问题。所以我会尽量提供详细的信息。在这种情况下,它是代码

服务器: 64位的

有三类:

DbOperationContext.cs

PerRequestLifeTimeManager.cs

RedisRepository.cs

我们正在统一使用Redis

在这种情况下,我们得到了一个奇怪的信息:

“Redis超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用中。”

我们检查了这些:

  • 问题是配置问题

  • 我们是否使用了错误的RedisServer.exe

  • 是否存在任何架构问题

有什么想法吗?有类似的故事吗

谢谢

额外信息1


服务器统计数据上没有被拒绝的连接问题(我已通过redis-cli.exe info命令进行了检查)

我继续调试此问题,并在我的平台上修复了许多问题以避免此异常。以下是我为解决这个问题所做的工作:

执行摘要:

遇到此异常的人员应检查:

  • 在singleton作用域中注册PooledRedisClientsManager(IRedisClientsManager)
  • RedisMqServer(IMessageService)已在单例作用域中注册
  • 正确处理从上述任何一个返回的任何已使用的客户端,以确保池化客户端不会过时
  • 我的问题的解决方案:

    首先,此异常由PooledRedisClient引发

    我正在StructureMap IoC容器中注册所有必需的Redis内容(不像作者的例子中的unity)。多亏有人提醒我PooledRedisClientManager应该是单例的,我还决定将RedisMqServer注册为单例:

    ObjectFactory.Configure(x=>
    {
    //在此AppDomain中将消息队列内容注册为Singleton
    x、 For()
    .Singleton()
    .使用(BuildRedisClientsManager);
    x、 For()
    .Singleton()
    .Use()
    .Ctor().Is(i=>i.GetInstance())
    .Ctor(“retryCount”).Is(2)
    .Ctor().Is(TimeSpan.FromSeconds(5));
    //从singleton IMessageService检索新的消息工厂
    x、 For()
    .Use(i=>i.GetInstance().MessageFactory);
    });
    
    我的“BuildRedisClientManager”函数如下所示:

    private静态IRedisClientsManager BuildRedisClientsManager()
    {
    var appSettings=新的appSettings();
    var redisClients=appSettings.Get(“redis服务器”,“redis.local:6379”).Split(',');
    var redisFactory=新的PooledRedisClientManager(RedisClient);
    redisFactory.ConnectTimeout=5;
    redisFactory.IdleTimeOutSecs=30;
    redisFactory.PoolTimeout=3;
    返回工厂;
    }
    
    然后,在生成消息时,正确处理客户端是非常重要的,否则我们会遇到可怕的“超时过期”(感谢)。我有以下帮助程序代码向队列发送消息:

    publicstaticvoidpublishmessage(T msg)
    {
    尝试
    {
    使用(var producer=GetMessageProducer())
    {
    制作人发布(msg);
    }
    }
    捕获(例外情况除外)
    {
    //TODO:日志或其他什么…我不是为了避免向用户显示我们的MQ已损坏
    }
    }
    私有静态IMessageQueueClient GetMessageProducer()
    {
    var producer=ObjectFactory.GetInstance()作为RedisMqServer;
    var client=producer.CreateMessageQueueClient();
    返回客户;
    }
    

    我希望这也能帮助解决您的问题。

    我以前见过类似的错误。为了修复它,我将redis.conf超时值设置为30,并将
    PooledRedisClientManager.IdleTimeOutSecs
    配置为30。这和你的情况不完全一样,但也许这是一个新的起点。我也犯了同样的错误。你找到解决办法了吗?System.TimeoutException:Redis超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中。在ServiceStack.Redis.PooledRedisClientManager.GetClient()中仍然没有解决方案,但有一个线索。。同时使用ReadonlyClient和Client似乎有问题。我也面临类似的问题。我有多个不同的ASP.net应用程序,连接到同一个redis服务器-一些应用程序可以工作,一些可以工作5分钟,然后开始抛出超时异常。redis实例上的信息报告了40个活动客户端,没有拒绝的连接。要尝试超时吗?除非你能在同一时间内解决它?嗨@nover,你用你在IoC注册的IMessageFactory做什么?干杯。事实上,我想我已经弄明白了——它是由ServiceStack基本服务类调用的。Hi@richardwhatever——IMessageFactory在SS中内部使用,并且(据我所知)如果您希望使用MQ模式,则需要注册:)