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 и не париться, но хочется все же разобраться.
  • Вопрос задан
  • 6129 просмотров
Пригласить эксперта
Ответы на вопрос 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 лежат данные, которые терять нельзя, то способ не подойдёт, но при правильных настройках сброса данных на диск риск потери данных будет минимальным.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы