redis - 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
?
解决方案
我认为答案是,一旦 Redis 达到峰值内存使用量,它在重新启动之前永远不会释放它。这是它使用的内存分配器的本质。
参考: https ://groups.google.com/forum/#!topic/redis-db/ibhYDLT_n68
推荐阅读
- postgresql - 如何在选择语句函数中编写更新方法?
- sql - 优化多个左连接 SQLite 查询
- android - 如何制作更好的视频服务器?
- android - 有人可以帮我吗?我无法使用 android 模拟器运行我的颤振应用程序
- python - python - 如何使用硒从内部类中查找元素?
- python - 将 __annotations__.keys() 用于 __slots__ 是一种好习惯吗?
- python - 我希望我的 Discord 机器人在有人写“abc”时回答“abc def”,但它不断发送垃圾邮件“abc def”
- c# - 从另一个程序集中使用 Startup.cs 失败
- android-studio - 未解决的参考 Java
- python - 如何将可变长度列表从一个 python 数据框列转换为行?