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



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



🔹Кэширование позволяет ускорить время отклика системы и повысить устойчивость к увеличению нагрузки (росту 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



#архитектура