Перейти к основному содержимому

Кэширование — разбор по полочкам

Кэширование — способ оптимизации приложений, при котором результаты выполнения операций сохраняются на некоторое время.

Кэширование позволяет ускорить время отклика системы и повысить устойчивость к увеличению нагрузки (росту RPS).

Главный принцип работы с кэшем: если вы можете обойтись без кэширования, то именно так и сделайте.

Как работает кэширование?

Логически кэш представляет собой базу типа ключ-значение. Каждая запись в кэше имеет "время жизни", по истечении которого она удаляется. Это время называют термином Time To Live или TTL. Размер кэша гораздо меньше, чем у основного хранилища, но этот недостаток компенсируется высокой скоростью доступа к данным. Это достигается за счет размещения кэша в быстродействующей памяти ОЗУ (RAM). Поэтому обычно кэш содержит самые "горячие" данные.

Процесс 1: Когда данные в кэше отсутствуют

  1. Пользователь запрашивает некие данные.
  2. Кэш приложения пуст, поэтому приложение обращается к базе данных (БД).
  3. БД возвращает запрошенные данные приложению.
  4. Приложение сохраняет полученные данные в кэше.
  5. Пользователь получает данные.

Процесс 2: В кэше есть данные

  1. Пользователь запрашивает данные.
  2. Приложение уже имеет эти данные в кэше (ведь они были записаны туда при первом обращении) и поэтому не обращается за ними к БД.
  3. Пользователь получает данные.

Стратегии инвалидации кэша

  • Инвалидация по TTL: TTL (Time To Live) — время жизни данных в кэше. При сохранении данных в кэш для них устанавливается TTL, и данные будут обновляться с периодичностью не менее TTL.
  • Инвалидация по событию: При таком подходе данные инвалидируют при наступлении некоего события — обычно это обновление данных в источнике.

Стратегии вытеснения

  • LRU (Least Recently Used): Стратегия вытеснения, которая опирается на время последнего использования записи. Она удаляет записи, у которых время последнего использования старше остальных. Таким образом, в кэше остаются записи, которые использовались недавно. Эта стратегия опирается на паттерн использования данных, поэтому она гораздо эффективнее предыдущих.
  • LFU (Least Frequently Used): Стратегия вытеснения, опирающаяся на частоту использования записи. Она удаляет записи, которые использовались реже всего. Так в кэше остаются данные, которые использовались чаще других. Эта стратегия тоже опирается на паттерн использования данных, поэтому она тоже эффективнее остальных и является альтернативой LRU.

Полную версию читайте на Хабре.

Полезные ссылки

  1. О стратегиях вытеснения на примере инструментов Redis
  2. Трудности и стратегии кэширования на сайте Amazon
  3. Основы кэширования от Amazon
  4. Базовый "ликбез" и ссылки на первоисточники от Wikipedia