TTL и вытеснение
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 оставить дополнительной страховкой.