背景:
我的服务在prod环境中的redis独立设置中缓存数据,使用带有@Cacheable注释的spring- data -redis RedisTemplate。我缓存了3分钟的数据,但是我发现我的redis内存在逐渐增加(这种观察持续了1-2周)。我怀疑我的redis密钥没有被驱逐,因为密钥的数量不断增加(这也可能是由于恒定的负载)。因此,我将我的服务从redis上断开了3分钟,并观察了redis的内存。所有的密钥都过期了,内存使用率下降。
然而,当我重新启动我的服务来缓存redis中的数据时,在1-2分钟内,我得到了与以前相同数量的键(这是预期的,因为我的服务负载很高),但redis的内存使用量要少得多。
下面是redis使用之前、未使用redis期间以及重新将我的服务连接到缓存后的键数图表

下面是redis在上述场景中使用的内存图

正如您所看到的,对于相同数量的密钥,redis在长时间(1-2周)运行时会消耗非常高的内存。当我从redis断开服务以清空所有密钥,然后再次重新启动以使用redis缓存时,对于相同数量的密钥,我的内存使用率非常低。
什么可以解释这种行为?会不会是内存泄漏,对于连接,我有一个扩展CachingConfigurerSupport的类。连接bean和redis模板bean如下:
@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory();
jedisConnFactory.setUsePool(true);
jedisConnFactory.setHostName(redisMasterUrl);
return jedisConnFactory;
}
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(cf);
return redisTemplate;
}在使用RedisTemplate时,我是否需要在任何地方关闭连接
发布于 2019-01-22 22:15:08
我认为答案是,一旦Redis达到内存使用的峰值,它就永远不会释放它,直到restarted.This成为它使用的内存分配器的本质。
参考:https://groups.google.com/forum/#!topic/redis-db/ibhYDLT_n68
https://stackoverflow.com/questions/54182801
复制相似问题