中文翻译暂不可用,显示俄语原文。

Настроить LFU eviction в Redis

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить LFU eviction в Redis

1. Цель задачи

Научиться настраивать политику вытеснения LFU (Least Frequently Used) в Redis и экспериментально подтвердить, что для определённого профиля нагрузки LFU даёт более высокий hit rate, чем LRU (Least Recently Used). В ходе выполнения вы развернёте Redis, сгенерируете синтетический трафик с неравномерным распределением частоты запросов, сравните hit rate при разных политиках и зафиксируете результаты.

Ключевой результат Задокументированный отчёт с графиками, доказывающими, что при работе с «горячими» ключами LFU обеспечивает hit rate на X% выше, чем LRU, а также настроенный Redis-экземпляр с политикой allkeys-lfu.


2. Исходные данные

Что нужноОткуда взять
Сервер Redis (v6+), доступный для конфигурированияУстановка из пакетов / Docker / облачный сервис (например, Redis Stack)
Утилита для генерации нагрузки (Python + redis-py)Создать самостоятельно по описанию ниже
Скрипт для сбора метрик hit rate и evictionsRedis INFO stats + Python
Инструмент визуализации (Matplotlib / seaborn)Python-скрипт

Если нет реального Redis — симулируем:

  1. Установите Docker Desktop (если ещё не установлен).
  2. Запустите контейнер Redis:
    docker run --name redis-lfu -p 6379:6379 -d redis:7-alpine
  3. Для изменения конфигурации используйте redis-cli CONFIG SET (есть внутри контейнера) или монтируйте свой redis.conf.
  4. Генерируйте нагрузку с того же хоста (через localhost).

3. Технологический стек

КомпонентИнструментыНазначение
База данныхRedis 7+ (Alpine)Хранилище кэша, объект эксперимента
Клиентская библиотекаredis-py (Python)Взаимодействие с Redis из скриптов
Генератор нагрузкиPython (random, time)Создание паттерна запросов с разной частотой
Сбор метрикINFO stats (команда Redis)Hit rate, evictions, keyspace
ВизуализацияMatplotlib / seabornГрафики сравнения hit rate
КонтейнеризацияDockerИзолированное окружение Redis

4. Этапы выполнения

Этап 1: Подготовка окружения и базовая настройка Redis (20 минут)

Действия

  1. Запустите Redis
    • Если используете Docker: docker run --name redis-exp -p 6379:6379 -d redis:7-alpine redis-server --maxmemory 50mb --maxmemory-policy allkeys-lru
    • (Параметр --maxmemory ограничивает кэш, чтобы вытеснение стало активным.)
  2. Проверьте, что Redis работает
    redis-cli pingPONG
  3. Установите Python-зависимости
    pip install redis matplotlib numpy
  4. Создайте директорию проекта /home/user/redis-lfu-experiment и перейдите в неё.

Ожидаемый результат этапа
Redis доступен, ограничен 50 MB, политика LRU. Подготовлен Python-окружение.


Этап 2: Генерация синтетической нагрузки и измерение hit rate при LRU (30 минут)

Действия

  1. Напишите скрипт load_generator.py, который:
    • подключается к Redis,
    • определяет 8000 уникальных ключей (key:0key:7999),
    • задаёт Zipf-распределение частоты (альфа ≈ 1.5) — небольшая часть ключей (≈20%) запрашивается очень часто, остальные редко,
    • на каждой итерации (всего 50 000 запросов) выбирает ключ согласно распределению, делает GET (если нет — SET с небольшим значением),
    • каждые 1000 запросов снимает показатели INFO stats (в частности keyspace_hits, keyspace_misses, evicted_keys),
    • сохраняет временной ряд метрик в CSV.
  2. Запустите скрипт и дождитесь завершения
    python load_generator.py --policy lru --output lru_metrics.csv
  3. Рассчитайте hit rate на каждом отрезке:
    hit_rate = hits / (hits + misses) * 100
    Постройте график hit_rate vs #requests (Matplotlib).

Ожидаемый результат этапа
CSV-файл с метриками LRU и график lru_hitrate.png. Hit rate в конце эксперимента (после 50k запросов) — базовое значение (например, 65%).


Этап 3: Переключение на LFU и настройка параметров (20 минут)

Действия

  1. Удалите все данные из Redis (чтобы начать с чистого листа):
    redis-cli FLUSHALL
  2. Измените политику вытеснения на allkeys-lfu:
    redis-cli CONFIG SET maxmemory-policy allkeys-lfu
    (Можно также сохранить в конфиг: CONFIG REWRITE)
  3. Опционально: настройте параметры LFU:
    • lfu-log-factor 10 (по умолчанию 10)
    • lfu-decay-time 1 (по умолчанию 1)
      Изучите влияние этих параметров на hit rate (дополнительное задание).
  4. Проверьте текущую политику:
    redis-cli CONFIG GET maxmemory-policyallkeys-lfu

Ожидаемый результат этапа
Redis настроен на LFU. Готов к запуску нагрузки с той же конфигурацией (50 MB).


Этап 4: Генерация нагрузки при LFU и сбор метрик (30 минут)

Действия

  1. Запустите тот же скрипт load_generator.py, но с параметром --policy lfu (или вторым прогоном после очистки данных).
    python load_generator.py --policy lfu --output lfu_metrics.csv
  2. Постройте график hit rate для LFU (аналогично этапу 2).
  3. Наложите графики LRU и LFU на один рисунок для сравнения.
  4. Посчитайте итоговый hit rate (за последние 5000 запросов) для обеих политик.
    Ключевой результат LFU должен показать hit rate выше, чем LRU (ожидаемое преимущество 3–10 процентных пунктов для Zipf-распределения).

Ожидаемый результат этапа
CSV-файл с метриками LFU, график lfu_hitrate.png, объединённый график comparison.png.


Этап 5: Анализ и документирование результатов (20 минут)

Действия

  1. Постройте дополнительные графики:
    • количество evicted_keys со временем (при LRU и LFU),
    • распределение количества попаданий по ключам (гистограмма).
  2. Сформируйте краткий отчёт в формате Markdown, содержащий:
    • условия эксперимента (емкость 50 MB, 8000 ключей, Zipf α=1.5, 50k запросов),
    • итоговые значения hit rate для LRU и LFU,
    • графики,
    • вывод: оправдала ли LFU ожидания.
  3. Сохраните все файлы в директории проекта:
    • report.md,
    • lru_metrics.csv, lfu_metrics.csv,
    • lru_hitrate.png, lfu_hitrate.png, comparison.png.

Ожидаемый результат этапа
Файл report.md с полным анализом и визуализациями.


5. Критерии приемки (Definition of Done)

  • Redis работает с политикой maxmemory-policy allkeys-lfu и ограничением 50 MB.
  • Скрипт генерации нагрузки использует Zipf-распределение и корректно измеряет hit rate.
  • Для LRU получен CSV и график hit rate.
  • Для LFU получен CSV и график hit rate.
  • На объединённом графике видно, что hit rate LFU стабильно выше LRU после ~10 000 запросов.
  • Итоговый hit rate LFU превышает LRU минимум на 2 процентных пункта.
  • Отчёт содержит описание эксперимента, численные результаты и вывод.
  • Все артефакты (CSV, PNG, report.md) сохранены в одном каталоге.

6. Ожидаемый результат

Основной артефакт
Каталог redis-lfu-experiment с файлами:

  • report.md — итоговый отчёт (условия, графики, сравнение hit rate LRU vs LFU);
  • lru_metrics.csv — временной ряд метрик LRU (колонки: request_num, hits, misses, evicted_keys, hit_rate);
  • lfu_metrics.csv — то же для LFU;
  • lru_hitrate.png — график hit rate LRU;
  • lfu_hitrate.png — график hit rate LFU;
  • comparison.png — наложенные графики.

Содержание отчёта (минимум):

  1. Цель
  2. Условия (Redis версия, maxmemory, количество ключей, распределение нагрузки)
  3. Результаты (таблица сравнения)
  4. Анализ (почему LFU лучше для данного паттерна)
  5. Скриншоты/графики

Дополнительно (опционально):

  • Исследование влияния lfu-log-factor и lfu-decay-time с отдельными графиками.

7. Возможные сложности и их решение

СложностьРешение
Redis не влезает в память (контейнер падает)Увеличьте --maxmemory до 100 MB или уменьшите количество ключей до 5000
Скрипт генерации нагрузки работает слишком долгоУменьшите общее число запросов до 20 000, убедитесь, что hit rate стабилизируется
Hit rate при LFU хуже, чем при LRUПроверьте, что распределение действительно Zipf; попробуйте увеличить lfu-log-factor (например, до 20)
Политика не применяется из-за отсутствия evictionУбедитесь, что maxmemory меньше, чем размер набора данных (например, 50 MB при 8000 ключах ~ 8 MB, но можно уменьшить maxmemory ещё сильнее)
Ошибка подключения к RedisПроверьте запущен ли контейнер: docker ps, порт 6379, хост localhost

8. Бюджет времени (оценка)

ЭтапВремя (минуты)
Этап 1: Подготовка окружения20
Этап 2: Нагрузка LRU + сбор30
Этап 3: Переключение на LFU20
Этап 4: Нагрузка LFU + сбор30
Этап 5: Анализ и документирование20
Итого120 минут (2 часа)

Примечание Для первого раза заложите дополнительно 30 минут на отладку скриптов и настройку Docker.


9. Связанные вопросы из базы знаний

ВопросТема
1. Что такое hit rate и как он рассчитывается?Метрики кэша
2. Как работает политика вытеснения LRU?Redis eviction
3. Чем LFU отличается от LRU?Алгоритмы вытеснения
4. Какие параметры Redis влияют на работу LFU?lfu-log-factor, lfu-decay-time
5. Как измерить эффективность кэша в production?Мониторинг
6. Какие метрики предоставляет INFO stats?Redis CLI
7. Как работает Zipf-распределение?Моделирование нагрузки
8. Как влияет размер maxmemory на hit rate?Емкость кэша
9. Какие ещё политики вытеснения есть в Redis?allkeys-lru, volatile-ttl, allkeys-random
10. Как тестировать кэш-стратегии в изолированном окружении?Docker / локальный Redis

10. Чек-лист самопроверки

  • Я запустил Redis с ограничением памяти 50 MB и политикой LRU.
  • Я написал скрипт с Zipf-распределением и проверил, что он корректно логирует метрики.
  • Я зафиксировал hit rate для LRU (не менее 2 цифр после запятой).
  • Я переключил политику на LFU и очистил БД.
  • Я выполнил второй прогон с теми же параметрами нагрузки.
  • Я построил сравнение и убедился, что hit rate LFU выше.
  • Я оформил отчёт с графиками и численными значениями.
  • В отчёте указаны условия эксперимента, ограничения и вывод.
  • Все файлы лежат в одной папке и готовы к сдаче.