Какие политики вытеснения (eviction) существуют?
Политика вытеснения — это алгоритм, определяющий, какой элемент удалить из кэша, когда он заполнен и нужно освободить место для новых данных.
Аналогия из жизни: политика вытеснения — как правила уборки книжной полки, когда она заполнена. LRU убирает книгу, которую дольше всего не открывали. LFU убирает ту, которую открывали реже всего за всё время. FIFO убирает ту, что стоит дольше всего.
Основные алгоритмы
| Политика | Алгоритм | Плюсы | Минусы |
|---|---|---|---|
| LRU (Least Recently Used) | Удаляет давно не использованный | Простой, хороший hit rate | Не учитывает частоту |
| LFU (Least Frequently Used) | Удаляет редко используемый | Учитывает популярность | Залипание старых популярных элементов |
| FIFO (First In First Out) | Удаляет самый старый | Очень простой | Не учитывает паттерн доступа |
| Random | Удаляет случайный | Простой, O(1) | Может удалить горячий элемент |
| W-TinyLFU (Caffeine) | LFU с окном + фильтром | Лучший hit rate | Сложная реализация |
LRU (используется в Redis, LinkedHashMap)
Пример
// Java: LRU-кэш на LinkedHashMap
Map<String, String> lruCache = new LinkedHashMap<>(100, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
return size() > 100; // удалять при превышении 100 элементов
}
};
Redis eviction policies
Пример
# redis.conf
maxmemory 256mb
maxmemory-policy allkeys-lru # LRU среди всех ключей
| Политика Redis | Описание |
|---|---|
noeviction |
Ошибка при нехватке памяти (по умолчанию) |
allkeys-lru |
LRU среди всех ключей |
volatile-lru |
LRU среди ключей с TTL |
allkeys-lfu |
LFU среди всех ключей (Redis 4.0+) |
volatile-lfu |
LFU среди ключей с TTL |
allkeys-random |
Случайный среди всех |
volatile-ttl |
Удалять ключи с ближайшим истечением TTL |
W-TinyLFU (Caffeine)
Caffeine использует Window TinyLFU — гибрид LRU и LFU с Bloom-фильтром для отслеживания частоты. Обеспечивает near-optimal hit rate с минимальными затратами памяти.
Пример
Caffeine.newBuilder()
.maximumSize(10_000) // при превышении — W-TinyLFU решает, что удалить
.build();
Ключевые принципы
- LRU — хорош для большинства случаев; используется в Redis (
allkeys-lru) - W-TinyLFU (Caffeine) — лучший hit rate среди in-process кэшей; рекомендуется для L1
- Redis
allkeys-lru— рекомендуемая политика для кэша;noeviction— для persistent storage volatile-*политики работают только с ключами, у которых установлен TTL
Частые ошибки
- Redis
noevictionдля кэша — при заполнении памяти Redis начнёт отдавать ошибки вместо вытеснения - LFU без decay — старые популярные ключи залипают навсегда; Redis LFU использует логарифмический decay
- Не установить
maxmemoryв Redis — Redis будет расти до OOM kill ОС
Как используется в 2026
- Redis:
allkeys-lruилиallkeys-lfu— стандартная конфигурация для кэша - Caffeine: W-TinyLFU по умолчанию — лучший in-process алгоритм
- Мониторинг eviction rate — если высокий, нужно увеличить
maximumSizeилиmaxmemory
На собеседовании: интервьюер ожидает знание LRU, LFU и W-TinyLFU, а также умение выбрать правильную политику Redis. Частая ошибка — не знать, что
noevictionстоит по умолчанию в Redis и не подходит для кэша.