Ответ
Когда Redis достигает лимита памяти (maxmemory), он начинает вытеснять данные согласно заданной политике (maxmemory-policy).
Основные политики вытеснения:
noeviction(по умолчанию): Redis не удаляет данные, а возвращает ошибку на команды записи (SET,LPUSHи т.д.). Команды чтения продолжают работать.LRU (Least Recently Used) — вытеснение давно неиспользуемых ключей:
allkeys-lru: Удаляет наименее используемый ключ из всех ключей.volatile-lru: Удаляет наименее используемый ключ только среди тех, у которых установленexpire(TTL).
LFU (Least Frequently Used) — вытеснение наименее часто используемых ключей:
allkeys-lfu: Удаляет ключ с наименьшим количеством обращений из всех ключей.volatile-lfu: Удаляет ключ с наименьшим количеством обращений среди тех, у которых установленexpire.
Другие политики:
allkeys-random: Удаляет случайный ключ из всех.volatile-random: Удаляет случайный ключ из тех, у которых установленexpire.volatile-ttl: Удаляет ключ с наименьшим оставшимся временем жизни (TTL) среди тех, у которых установленexpire.
Дополнительные стратегии управления памятью:
- TTL (Time-To-Live): Проактивно устанавливать срок жизни для ключей, которые не нужно хранить вечно (
EXPIRE,SETEX). - Шардирование (Sharding): Горизонтально масштабировать данные, распределяя их по нескольким инстансам Redis (например, с помощью
Redis Cluster). - Сжатие данных: Хранить значения в сжатом виде (например, используя
MessagePackилиProtobufвместоJSON), что уменьшает потребление памяти. - Оптимизация структур данных: Использовать более эффективные с точки зрения памяти структуры данных Redis, когда это возможно (например,
Hashes,Lists,Sorted Setsвместо хранения больших JSON-объектов в строках).
Настройка политики выполняется в конфигурационном файле или через команду CONFIG SET:
# В файле redis.conf (рекомендуемый способ)
maxmemory 2gb
maxmemory-policy allkeys-lru
# Или в рантайме через redis-cli
CONFIG SET maxmemory "2gb"
CONFIG SET maxmemory-policy allkeys-lru