无法连接到Redis服务器。连接超时

时间:2019-06-03 11:01:07

标签: c# redis stackexchange.redis azure-redis-cache

我正在将Azure Function V1与StackExchange.Redis 1.2.6一起使用。每分钟接收1000条消息的功能,对于每条消息,对于每台设备,我正在检查Redis。我注意到当时我们收到更多邮件时,就会遇到错误。

  

执行功能时发生异常:TSFEventRoutingFunction没有连接可用于服务此操作:HGET GEO_DYNAMIC_hash;无法连接到Redis服务器。 ConnectTimeout; IOCP:(忙= 1,空闲= 999,最小值= 24,最大值= 1000),工作人员:(忙= 47,空闲= 32720,最小值= 24,最大值= 32767),本地CPU:不适用可以连接到Redis服务器; ConnectTimeout

MS建议的

CacheService

public class CacheService : ICacheService
{
    private readonly IDatabase cache;
    private static readonly string connectionString = ConfigurationManager.AppSettings["RedisConnection"];

    public CacheService()
    {
        this.cache = Connection.GetDatabase();
    }

    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
    {
        return ConnectionMultiplexer.Connect(connectionString);
    });

    public static ConnectionMultiplexer Connection
    {
        get
        {
            return lazyConnection.Value;
        }
    }

    public async Task<string> GetAsync(string hashKey, string ruleKey)
    {
        return await this.cache.HashGetAsync(hashKey, ruleKey);
    }
}

我要在Azure函数中注入ICacheService,并在每个请求上调用GetAsync方法。

使用Azure Redis实例C3

enter image description here

当前,您可以看到我有一个连接,创建多个连接将有助于解决此问题?或解决或理解此问题的其他建议。

2 个答案:

答案 0 :(得分:1)

您遇到的错误有许多不同的原因。我可以想到以下一些方法(不是按特定顺序排列):

  1. 您的connectTimeout太小。我经常看到客户经常设置较小的连接超时,因为他们认为这将确保在该时间段内建立连接。这种方法的问题是,当出现问题(高客户端CPU,高服务器CPU等)时,连接尝试将失败。这通常会使糟糕的情况变得更糟-迫使系统重新启动尝试重新连接的过程,而不是助长了问题,常常导致 connect-> fail-> retry 循环。我通常建议您将connectionTimeout设置为15秒或更长时间。最好让连接尝试在15或20秒后成功,而不是让连接尝试重复5秒后失败,这样会导致故障持续数分钟,直到系统最终恢复为止。

  2. 发生服务器端故障转移。由于某种类型的从主节点到副本的故障转移,服务器断开了连接。如果在Redis层,OS层或托管层更新服务器端软件,则会发生这种情况。

  3. 某种类型的网络基础结构故障(位于客户端和服务器之间的硬件会遇到某种类型的问题)。

  4. 您更改Redis实例的访问密码。更改密码将重置与所有客户端的连接,以强制它们重新进行身份验证。

  5. 线程池设置需要调整。如果未针对您的工作负载正确调整线程池设置,则在将新线程旋转为explained here时会遇到延迟。

我写了一堆best practices for Redis,可以帮助您避免其他问题。

答案 1 :(得分:0)

我们通过将StackExchange.Redis升级到2.1.30解决了这个问题。