Какие существуют политики вытеснения данных (eviction policies) в Redis и другие способы борьбы с переполнением памяти?

Ответ

Когда Redis достигает лимита памяти (maxmemory), он начинает вытеснять данные согласно заданной политике (maxmemory-policy).

Основные политики вытеснения:


  1. noeviction (по умолчанию): Redis не удаляет данные, а возвращает ошибку на команды записи (SET, LPUSH и т.д.). Команды чтения продолжают работать.


  2. LRU (Least Recently Used) — вытеснение давно неиспользуемых ключей:

    • allkeys-lru: Удаляет наименее используемый ключ из всех ключей.
    • volatile-lru: Удаляет наименее используемый ключ только среди тех, у которых установлен expire (TTL).
  3. LFU (Least Frequently Used) — вытеснение наименее часто используемых ключей:

    • allkeys-lfu: Удаляет ключ с наименьшим количеством обращений из всех ключей.
    • volatile-lfu: Удаляет ключ с наименьшим количеством обращений среди тех, у которых установлен expire.
  4. Другие политики:

    • 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