Звучит так, как будто вы получаете OOM command not allowed
ошибок, если вы не запускаете redis-cli --bigkeys
два раза в день.
В этом случае у вас, вероятно, много и / или больших клавиш с EXPIRE
, которые постоянно добавляются , Ключи с истекшим сроком хранения удаляются из памяти:
- Пассивно: когда вы пытаетесь получить к нему доступ и обнаруживается, что срок действия ключа истек. Вот как
redis-cli --bigkeys
помогает вам , он вызывает пассивное удаление по всему пространству клавиш. - Активно: каждые 100 мс он пытается удалить из памяти ключи с истекшим сроком действия в случайном порядке , никогда не тратя на это больше 1 мс за цикл, пока не оценивается, что истекло менее 25% ключи остаются. Логика c не такая уж тривиальная, см. activeExpireCycle .
Так что все это указывает на то, что активное истечение срока не может наверстать упущенное в вашем случае.
Из вашего комментария maxmemory=0
и maxmemory-policy=noeviction
. Возможно, вы захотите установить значение maxmemory
и от maxmemory-policy=noeviction
до volatile-ttl
(удалите ключ с ближайшим временем истечения).
Что это делает, когда команда записи обнаруживает, что вы превысили maxmemory
, она будет пытаться освободить место для нового ключа в соответствии с политикой. Политика volatile-ttl
будет сначала удалять все оставшиеся ключи с истекшим сроком действия. См. Evict. c.
Вы также можете увеличить частоту фоновых задач, чаще чистить устаревшие ключи, см. Hz в redis.conf . Вы можете удвоить его до 20.
По умолчанию для "hz" установлено значение 10. Увеличение значения будет использовать больше ресурсов ЦП, когда Redis находится в режиме ожидания, но в то же время сделает Redis более отзывчивым, когда многие ключи истекают одновременно, и время ожидания может быть обработано с большей точностью.
Кроме того, activedefrag
= yes
может помочь, см. здесь .
Существует новый параметр active-expire-effort
redis.conf, который позволит вам вкладывать больше ресурсов процессора в active-expire, но он недоступен в последней стабильной версии (5.0.7).
Используйте INFO memory
, чтобы получить представление о состоянии памяти вашего сервера Redis. Пожалуйста, обновите вопрос этим выводом, если вышесказанное вам не поможет.