问题描述
我正在使用带有 @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 确实有连接限制,但看起来我的应用程序并没有接近限制。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)