Проверяет понимание стратегий кэширования для сценариев с редким обновлением данных и высокой частотой чтения.
Когда данные редко изменяются, но запрашиваются очень часто, основной узким местом становится база данных или внешний сервис. Каждый запрос к ним требует времени на обработку, что увеличивает задержку и нагрузку. Решение — кэширование: сохранение копии данных в быстром хранилище, чтобы повторные запросы обслуживались без обращения к источнику.
Существует несколько уровней кэширования. Для статических ресурсов (изображения, CSS, JS) используется CDN, который размещает копии на серверах по всему миру. Для динамических данных, таких как профиль пользователя или список товаров, применяется in-memory кэш, например Redis или Memcached. Также можно использовать кэш на уровне приложения (например, в памяти процесса) для очень горячих данных.
// Псевдокод: получение данных с кэшем
const data = await redis.get('user:123');
if (!data) {
data = await db.query('SELECT * FROM users WHERE id = 123');
await redis.set('user:123', data, 'EX', 3600); // TTL 1 час
}
return data;В этом примере при первом запросе данные читаются из БД и сохраняются в Redis на час. Последующие запросы обслуживаются из Redis, что значительно быстрее.
Главная сложность — синхронизация кэша с источником. Если данные обновились, кэш должен быть обновлён или удалён. Для этого используют TTL (время жизни) или явную инвалидацию при записи. Например, при изменении пользователя можно удалить ключ из Redis, чтобы следующий запрос загрузил свежие данные.
Кэширование — оптимальный подход для read-heavy сценариев с редкими обновлениями. Оно снижает нагрузку на БД, уменьшает задержки и повышает пропускную способность. Применяйте его для часто запрашиваемых данных, но не забывайте про стратегию инвалидации, чтобы избежать устаревших данных.