对于相同数量的键,Redis会消耗更多的内存超时时间

时间:2019-01-14 13:49:34

标签: redis spring-data spring-data-redis

背景:

我的服务通过使用RedisTemplate注释的spring-data-redis @Cacheable在产品环境中的redis独立设置中缓存数据。我将数据缓存了3分钟,但是我发现我的Redis内存在逐渐增加(此观察进行了1-2周)。我怀疑我的redis密钥没有被收回,因为密钥数量不断增加(这也可能是由于持续的负载)。因此,我断开了与Redis的服务3分钟的连接,并观察了Redis内存。所有密钥都已过期,内存使用率下降了。

但是,当我重新启动服务以在redis中缓存数据时,在执行相同操作的1-2分钟内,我得到的键数与以前相同(这是我的服务负载高的预期值),但是内存使用率很高Redis的数量明显减少。

以下是Redis在未使用Redis期间,重新使用期间以及将我的服务重新连接到缓存之后的键数量图

enter image description here

以下是Redis在上述情况下使用的内存图

enter image description here

如您所见,对于相同数量的键,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时是否需要在任何地方关闭连接?

1 个答案:

答案 0 :(得分:1)

我认为答案是,Redis一旦达到峰值内存使用量,它就不会释放它直到重新启动。这就是它使用的内存分配器的本质。

参考: https://groups.google.com/forum/#!topic/redis-db/ibhYDLT_n68