间歇性Redis超时

时间:2019-09-05 19:27:07

标签: spring-mvc redis jedis spring-data-redis google-cloud-memorystore

迁移到GCP和Cloud Memorystore后,我们的间歇性Redis超时。

我们正在从运行在GKE中的Java Spring应用程序进行连接。在迁移到GCP之前,我们没有这些问题。

与旧环境的一些关键区别:

  • 我们将4个Redis实例合并为2
  • 我们正在运行自己的Redis服务器,而不是托管(Memorystore)

主要统计数据:

  • 一个实例平均每秒约5,000个呼叫
  • 另一个实例每秒获得约1,000次通话

我们正在使用:

>>> df.loc['gameswon'].sum()
312

我们使用以下代码实例化连接:

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>2.1.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.3</version>
        </dependency>

我们尝试调整池的大小,但没有帮助。

我们整天间歇性地获得这些例外:

    public JedisConnectionFactory getJedisConnectionFactoryOne()
    {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(MAX_TOTAL);
        jedisPoolConfig.setMaxIdle(MAX_IDLE);
        jedisPoolConfig.setMinIdle(MIN_IDLE);
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
        jedisConnectionFactory.setHostName(REDIS_HOST_1);
        jedisConnectionFactory.setPort(REDIS_PORT);
        return jedisConnectionFactory;
    }

1 个答案:

答案 0 :(得分:0)

将客户端的超时时间从默认值(2秒)更改为5秒似乎已完全阻止了错误。

jedisConnectionFactory.setTimeout(5000);

这很奇怪,因为从我们的APM监视来看,它显示p95 redis调用小于20μs,p99 <20ms,最大延迟小于500ms。所以我不完全确定为什么我们会首先收到这么多的超时错误。

一旦快照和发行版结束,我们将升级到spring-data-redis 2.2.x(jedis 3.x)。