Задать вопрос
Akuma
@Akuma
Веб-программист

Как избежать «OOM command not allowed when used memory > 'maxmemory'.» в Redis/PHP?

Есть docker-сервис Redis, который используется как LRU-кеш. Объем одной записи примерно до 100Кб.
Память сервиса жетско ограничена 64mb, т.к. на больше и не надо, а все записи хранятся всего минуту и потом попросту не нужны.

В некоторые особо активные моменты, когда память заполняется, возникает исключение OOM command not allowed when used memory > 'maxmemory'.
Я прекрасно понимаю, что оно означает и почему возникает. Но никак не могу заставить Редис банально очищать старые ключи и заносить новые, чтобы все было без исключений.

Подскажите, какие настройки ему выставить, чтобы он правильно очищал старые ключи? Сохранение на диск отключено и не нужно. Все ключи с expires

Сейчас запускается вот так (docker-compose):
redis_cache:
    mem_limit: 64m
    image: redis:4.0-alpine
    command: "redis-server --port 6379 --timeout 0 --save \"\" --appendonly no --maxclients 1000000 --maxmemory 60m --maxmemory-policy allkeys-lru --maxmemory-samples 50"


maxmemory стоит чуть ниже, т.к. иначе при переполнении он еще и падает, что слишком уж плохо.
maxmemory-samples - что без него, что с ним. По моему, вообще без эффекта.

P.S. Да, можно использовать memcache и не париться, но хочется все же разобраться.
  • Вопрос задан
  • 6698 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
@PapaStifflera
Родился, вырос...
Ни как. Redis, в отличии от Memcache, гарантирует сохранность данных. Т.е. вы выставляете для записи TTL и она будет храниться ровно столько времени, сколько указано в значении TTL. Memcached вытесняет старые данные в случае, если памяти для новой порции не хватает не смотря на TTL.
Ответ написан
@Pal9yni4bi
Изучаю сейчас тот же вопрос, и, если верить https://ma.ttias.be/redis-oom-command-not-allowed-... требуемого поведения всё же можно добиться.
Фактически, в заданных в вопросе условиях должно быть достаточно изменить параметр

maxmemory-policy volatile-lru

на

maxmemory-policy allkeys-lru


После этого, естественно, перезапустить Redis.

Обращаю внимание, что если в Redis лежат данные, которые терять нельзя, то способ не подойдёт, но при правильных настройках сброса данных на диск риск потери данных будет минимальным.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽