Redis использует больше памяти сверхурочно для того же количества ключей - PullRequest
0 голосов
/ 14 января 2019

Фон:

Мой сервис кэширует данные в автономной установке redis в среде prod, используя spring-data-redis RedisTemplate с использованием аннотации @Cacheable. Я кеширую данные в течение 3 минут, однако я увидел, что моя память Redis постепенно увеличивается (это наблюдение проводилось в течение 1-2 недель). Я подозревал, что мои клавиши Redis не были выселены, так как количество клавиш постоянно увеличивалось (это также может быть связано с постоянной загрузкой). Таким образом, я отключил свой сервис от redis на 3 минуты и наблюдал redis memory. Срок действия всех ключей истек, а использование памяти сократилось.

Однако, когда я перезапустил свой сервис для кэширования данных в redis, в течение 1-2 минут после выполнения того же действия я получил то же количество ключей, что и раньше (это ожидалось, так как нагрузка на мой сервис была высокой), но использование памяти редиса было значительно меньше.

Ниже приведен график количества ключей в redis до, во время неиспользования redis и после повторного подключения моей службы к кешу

enter image description here

Ниже приведен график памяти, используемой Redis для вышеуказанных сценариев

enter image description here

Как вы можете видеть, для того же количества ключей Redis потребляет очень много памяти, когда он работал в течение длительного времени (1-2 недели). Когда я отключил службу от redis, чтобы очистить все ключи, а затем снова перезапустил ее, чтобы использовать кэш redis, использование моей памяти было очень низким при том же количестве ключей

Что может объяснить это поведение? Может ли это быть утечка памяти, для соединения у меня есть класс, который расширяет CachingConfigurerSupport. Bean-соединение и bean-шаблон redis:

@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 голосов
/ 22 января 2019

Я думаю, что ответ заключается в том, что, как только Redis достигает пикового использования памяти, он никогда не освобождает его до перезапуска. Такова природа распределителя памяти, который он использует.

Ссылка: https://groups.google.com/forum/#!topic/redis-db/ibhYDLT_n68

...