spring引导redis缓存创建许多新的redis连接

cyvaqqii  于 2021-06-27  发布在  Java
关注(0)|答案(0)|浏览(280)

我使用内置的springboot1redis库和@cacheable注解在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());
    }

我使用莴苣连接到集群,因为SpringBoot1Jedis和通过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 properties配置的。
我的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 metrics显示了创建的大量新连接(根据cloudwatch metrics,一分钟内会有2000多个新连接)。
我假设莴苣在线程之间共享连接,但事实似乎并非如此。我的配置是否设置不正确?我想我可以通过升级到springboot2来解决这个问题,但这不是一个简单的升级,因为它是一个相当大的应用程序,我希望我可以在springboot1中解决这个问题。
这些新的联系不是问题吗?我知道redis确实有连接限制,但看起来我的应用程序并没有接近这个限制。
aws指标

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题