Spring Boot Redis 缓存创建许多新的 Redis 连接

问题描述

我正在使用带有 @Cacheable 注释的内置 Spring Boot 1 Redis 库来缓存 Redis 中的某些值。 Redis 集群托管在 AWS 中,未启用 SSL 和密码的集群。

我使用注释的一个例子是:

    @Cacheable(value = "example",key = "'example-'.concat(#id.toString())")
    public List<DTO> getById(Long id) {
        List<DBObject> dbObjectList = dbClient.getById(id);
        return dbObjectList.stream()
            .map(dbObject -> transformer.transformToDTO(dbObject))
            .collect(Collectors.toList());
    }

我使用 Lettuce 连接到集群,因为 Spring Boot 1 Jedis 和通过 SSL 连接存在问题。我的Redis配置是:

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
        lettuceConnectionFactory.setHostName(host);
        lettuceConnectionFactory.setPort(port);
        lettuceConnectionFactory.setPassword(password);
        lettuceConnectionFactory.setUseSsl(ssl);
        return lettuceConnectionFactory;
    }

    @Bean
    public static <T> Redistemplate<String,T> redistemplate(RedisConnectionFactory redisConnectionFactory,ObjectMapper objectMapper) {
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
        Redistemplate<String,T> template = new Redistemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(genericJackson2JsonRedisSerializer);
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        return template;
    }

其中主机、端口、密码和 ssl 均通过 application.yml/environment 属性进行配置。

我的 Redis 缓存是通过以下方式配置的:

    @Bean
    public <T> RedisCacheManager redisCacheManager(Redistemplate<String,T> redistemplate) {
        final List<String> cacheNamesList = Arrays.asList(cacheName);
        final RedisCacheManager redisCacheManager = new RedisCacheManager(redistemplate,cacheNamesList);
        final Map<String,Long> expiresMap = new HashMap<>();
        expiresMap.put(cacheName,cacheTTL);
        redisCacheManager.setExpires(expiresMap);
        return redisCacheManager;
    }

这一切都按预期工作,并且使用正确的 TTL 正确缓存了值。我遇到的问题是 AWS Redis 指标显示创建了大量新连接(根据 Cloudwatch 指标,一分钟内增加了 2000 个新连接)。

我假设 Lettuce 在线程之间共享连接,但事实并非如此。我的生菜配置设置不正确吗?我想我可以通过升级到 Spring Boot 2 来解决这个问题,但这不是一个微不足道的升级,因为它是一个相当大的应用程序,我希望我可以在 Spring Boot 1 中解决这个问题。

这些新连接不是问题吗?我知道 Redis 确实有连接限制,但看起来我的应用程序并没有接近限制。

AWS Metrics

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)