首页 > 解决方案 > Redis 对于相同数量的键超时消耗更多内存

问题描述

背景:

RedisTemplate我的服务使用带有@Cacheable注释的 spring-data-redis 在 prod 环境中的 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

标签: redisspring-dataspring-data-redis

解决方案


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

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


推荐阅读