gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:06:03 25 4
gpt4 key购买 nike

背景:

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

但是,当我重新启动我的服务以在 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 时在任何地方关闭连接?

最佳答案

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

引用: https://groups.google.com/forum/#!topic/redis-db/ibhYDLT_n68

关于对于相同数量的键,Redis 超时消耗更多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54182801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com