背景:
我的服务通过使用RedisTemplate
注释的spring-data-redis @Cacheable
在产品环境中的redis独立设置中缓存数据。我将数据缓存了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
时是否需要在任何地方关闭连接?
答案 0 :(得分:1)
我认为答案是,Redis一旦达到峰值内存使用量,它就不会释放它直到重新启动。这就是它使用的内存分配器的本质。
参考: https://groups.google.com/forum/#!topic/redis-db/ibhYDLT_n68