Ответ
Когда 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