TTL и вытеснение

Базовый System Design
≈ 2 мин чтения

TTL ограничивает возраст записи

Кэш не должен хранить значение бесконечно только потому, что когда-то его прочитали. TTL — time to live — задаёт, сколько запись может жить в кэше. После истечения этого времени она считается просроченной и больше не используется как обычный hit.

key = product:42
ttl = 5 minutes

Короткий TTL быстрее избавляется от старых данных, но чаще создаёт miss и нагрузку на основной источник. Длинный TTL повышает шанс попадания, но увеличивает время, в течение которого кэш потенциально может хранить устаревшую копию.

Eviction ограничивает размер кэша

Даже записи с TTL могут не помещаться в доступную память. Тогда кэш должен вытеснить часть значений раньше срока. Политика eviction определяет, какие записи будут удалены при нехватке места.

Например, можно предпочитать удаление давно не использовавшихся записей или данных, к которым обращаются редко. Реальные системы часто используют приближённые варианты таких политик, потому что идеально отслеживать каждый доступ тоже стоит ресурсов.

TTL и eviction решают разные задачи

TTL отвечает на вопрос «слишком ли стара эта запись», а eviction — «какую запись убрать, если места не хватает». Одна запись может быть вытеснена задолго до истечения TTL, а другая — удалена именно из-за срока жизни.

Срок жизни выбирают по смыслу данных

Для редко меняющегося справочника допустим один TTL, для быстро меняющейся цены — другой. Иногда срок жизни вообще не должен быть единственным механизмом актуальности: важное изменение лучше отражать в кэше сразу, а TTL оставить дополнительной страховкой.

TTL — это компромисс между свежестью и количеством miss. Не существует одного «правильного» значения для всего кэша: срок жизни должен соответствовать конкретным данным и допустимой устарелости.