中文翻译暂不可用,显示俄语原文。
Настроить 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 и evictions | Redis INFO stats + Python |
| Инструмент визуализации (Matplotlib / seaborn) | Python-скрипт |
Если нет реального Redis — симулируем:
- Установите Docker Desktop (если ещё не установлен).
- Запустите контейнер Redis:
docker run --name redis-lfu -p 6379:6379 -d redis:7-alpine - Для изменения конфигурации используйте
redis-cli CONFIG SET(есть внутри контейнера) или монтируйте свойredis.conf. - Генерируйте нагрузку с того же хоста (через 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 минут)
Действия
- Запустите Redis
- Если используете Docker:
docker run --name redis-exp -p 6379:6379 -d redis:7-alpine redis-server --maxmemory 50mb --maxmemory-policy allkeys-lru - (Параметр
--maxmemoryограничивает кэш, чтобы вытеснение стало активным.)
- Если используете Docker:
- Проверьте, что Redis работает
redis-cli ping→PONG - Установите Python-зависимости
pip install redis matplotlib numpy - Создайте директорию проекта
/home/user/redis-lfu-experimentи перейдите в неё.
Ожидаемый результат этапа
Redis доступен, ограничен 50 MB, политика LRU. Подготовлен Python-окружение.
Этап 2: Генерация синтетической нагрузки и измерение hit rate при LRU (30 минут)
Действия
- Напишите скрипт
load_generator.py, который:- подключается к Redis,
- определяет 8000 уникальных ключей (
key:0…key:7999), - задаёт Zipf-распределение частоты (альфа ≈ 1.5) — небольшая часть ключей (≈20%) запрашивается очень часто, остальные редко,
- на каждой итерации (всего 50 000 запросов) выбирает ключ согласно распределению, делает
GET(если нет —SETс небольшим значением), - каждые 1000 запросов снимает показатели
INFO stats(в частностиkeyspace_hits,keyspace_misses,evicted_keys), - сохраняет временной ряд метрик в CSV.
- Запустите скрипт и дождитесь завершения
python load_generator.py --policy lru --output lru_metrics.csv - Рассчитайте 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 минут)
Действия
- Удалите все данные из Redis (чтобы начать с чистого листа):
redis-cli FLUSHALL - Измените политику вытеснения на
allkeys-lfu:
redis-cli CONFIG SET maxmemory-policy allkeys-lfu
(Можно также сохранить в конфиг:CONFIG REWRITE) - Опционально: настройте параметры LFU:
lfu-log-factor 10(по умолчанию 10)lfu-decay-time 1(по умолчанию 1)
Изучите влияние этих параметров на hit rate (дополнительное задание).
- Проверьте текущую политику:
redis-cli CONFIG GET maxmemory-policy→allkeys-lfu
Ожидаемый результат этапа
Redis настроен на LFU. Готов к запуску нагрузки с той же конфигурацией (50 MB).
Этап 4: Генерация нагрузки при LFU и сбор метрик (30 минут)
Действия
- Запустите тот же скрипт
load_generator.py, но с параметром--policy lfu(или вторым прогоном после очистки данных).
python load_generator.py --policy lfu --output lfu_metrics.csv - Постройте график hit rate для LFU (аналогично этапу 2).
- Наложите графики LRU и LFU на один рисунок для сравнения.
- Посчитайте итоговый hit rate (за последние 5000 запросов) для обеих политик.
Ключевой результат LFU должен показать hit rate выше, чем LRU (ожидаемое преимущество 3–10 процентных пунктов для Zipf-распределения).
Ожидаемый результат этапа
CSV-файл с метриками LFU, график lfu_hitrate.png, объединённый график comparison.png.
Этап 5: Анализ и документирование результатов (20 минут)
Действия
- Постройте дополнительные графики:
- количество evicted_keys со временем (при LRU и LFU),
- распределение количества попаданий по ключам (гистограмма).
- Сформируйте краткий отчёт в формате Markdown, содержащий:
- условия эксперимента (емкость 50 MB, 8000 ключей, Zipf α=1.5, 50k запросов),
- итоговые значения hit rate для LRU и LFU,
- графики,
- вывод: оправдала ли LFU ожидания.
- Сохраните все файлы в директории проекта:
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— наложенные графики.
Содержание отчёта (минимум):
- Цель
- Условия (Redis версия, maxmemory, количество ключей, распределение нагрузки)
- Результаты (таблица сравнения)
- Анализ (почему LFU лучше для данного паттерна)
- Скриншоты/графики
Дополнительно (опционально):
- Исследование влияния
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: Переключение на LFU | 20 |
| Этап 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 выше.
- Я оформил отчёт с графиками и численными значениями.
- В отчёте указаны условия эксперимента, ограничения и вывод.
- Все файлы лежат в одной папке и готовы к сдаче.