Eviction в Redis — это автоматическое удаление ключей из памяти, когда Redis достиг установленного лимита памяти и ему нужно освободить место для новых данных.
То есть eviction возникает не потому, что у ключа истёк TTL, а потому что Redis упёрся в ограничение:
maxmemory 2gb
Когда процесс Redis использует примерно этот объём памяти, дальнейшее поведение определяется политикой:
maxmemory-policy allkeys-lru
Expiration:
ключ удаляется, потому что истёк его TTL
Eviction:
ключ удаляется досрочно, потому что Redis не хватает памяти
Например:
SET session:123 "data" EX 3600
Ключ должен жить час. Но при нехватке памяти Redis может удалить его через пять минут, если текущая eviction policy разрешает удалять этот ключ.
Основные политики eviction
noeviction
Redis ничего автоматически не удаляет.
Когда память закончится, команды записи начнут возвращать ошибку:
OOM command not allowed when used memory > 'maxmemory'
Чтение продолжит работать.
Это часто выбирают, когда данные нельзя терять незаметно.
allkeys-lru
Redis может удалить любой ключ.
Выбираются ключи, которые давно не использовались:
Least Recently Used
Подходит для обычного кэша.
Пример логики:
ключ A читали секунду назад
ключ B читали час назад
ключ C читали вчера
скорее всего будет удалён C
Redis использует приближённый LRU, а не идеально точный полный порядок всех ключей.
allkeys-lfu
Удаляются ключи, которые используются реже всего:
Least Frequently Used
Разница:
LRU: когда ключ использовали последний раз
LFU: насколько часто ключ используют
Ключ могли недавно прочитать один раз, но если другой ключ читается постоянно, LFU скорее сохранит второй.
Для кэшей с устойчиво «горячими» данными LFU часто логичнее LRU.
allkeys-random
Redis удаляет случайный ключ.
Политика простая, но обычно менее эффективная для кэша, потому что может удалить активно используемые данные.
volatile-lru
Redis удаляет только ключи, у которых установлен TTL.
Из них выбираются давно не использовавшиеся.
Ключи без TTL не участвуют в eviction.
volatile-lfu
Удаляются редко используемые ключи, но только среди ключей с TTL.
volatile-random
Удаляется случайный ключ среди ключей с TTL.
volatile-ttl
Redis удаляет ключи, у которых раньше всего должен закончиться TTL.
Например:
key:A TTL 10 секунд
key:B TTL 5 минут
key:C TTL 1 час
Сначала кандидатом будет key:A.
Что означает allkeys и volatile
Это главное различение.
allkeys-*
Redis может удалить любой ключ:
с TTL
без TTL
volatile-*
Redis может удалить только ключи, у которых есть TTL.
Если TTL нет ни у одного ключа, политика volatile-lru фактически начинает вести себя как noeviction: удалять нечего, поэтому запись завершится ошибкой OOM.
Типичный выбор
Для чистого кэша:
maxmemory-policy allkeys-lru
или:
maxmemory-policy allkeys-lfu
Для Redis, где хранятся важные данные:
maxmemory-policy noeviction
Но здесь уже важно понимать: Redis сам по себе не превращается в безопасную базу только из-за noeviction. Нужны persistence, репликация, резервные копии и понимание режима отказа.
Для смешанного Redis, где постоянные ключи нельзя удалять, а временные можно:
maxmemory-policy volatile-lru
Но такая схема опасна тем, что постоянные ключи могут заполнить всю память, после чего Redis перестанет принимать записи.
Как посмотреть текущие настройки
CONFIG GET maxmemory
CONFIG GET maxmemory-policy
Например:
1) "maxmemory"
2) "2147483648"
1) "maxmemory-policy"
2) "allkeys-lru"
2147483648 байт — это 2 GiB.
Как посмотреть количество удалений
INFO stats
Там есть показатель:
evicted_keys:12345
Он показывает, сколько ключей Redis удалил из-за нехватки памяти с момента запуска или сброса статистики.
Это не количество ключей, удалённых по TTL. Для истёкших ключей есть отдельный показатель:
expired_keys
То есть:
evicted_keys → память закончилась
expired_keys → закончился TTL
Самая важная практическая мысль
Если Redis используется как кэш, eviction является нормальной частью его работы:
кэш заполняется → старые или бесполезные данные вытесняются → новые записываются
Если Redis используется как хранилище состояния, eviction может означать скрытую потерю данных:
ключ существовал
TTL ещё не закончился
Redis удалил его из-за давления памяти
приложение внезапно перестало находить данные
Поэтому eviction policy — это не мелкая настройка производительности. Это правило, определяющее, какие данные Redis имеет право уничтожить при нехватке памяти.