Что такое кэширование в разработке ПО?

«Что такое кэширование в разработке ПО?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кэширование — это техника хранения копии данных или результатов вычислений во временном, быстродоступном хранилище (кэше) для ускорения последующих обращений к ним и снижения нагрузки на основную систему (БД, внешний API).

Типичные сценарии использования:

  1. Кэширование на стороне клиента: Браузер кэширует статические ресурсы (CSS, JS, изображения).
  2. Кэширование на стороне сервера:
    • Кэш запросов к БД (используя Redis, Memcached).
    • Кэширование ответов API (полных HTML-страниц или JSON-данных).

Пример реализации на Node.js с Redis:

const redis = require('redis');
const client = redis.createClient();

async function getUser(id) {
  const cacheKey = `user:${id}`;
  // 1. Попытка получить данные из кэша
  const cachedUser = await client.get(cacheKey);
  if (cachedUser) {
    console.log('Cache hit!');
    return JSON.parse(cachedUser);
  }

  console.log('Cache miss!');
  // 2. Если в кэше нет, запрашиваем из БД (дорогая операция)
  const userFromDb = await db.query('SELECT * FROM users WHERE id = ?', [id]);

  // 3. Сохраняем результат в кэш на 5 минут (TTL = 300 секунд)
  await client.setEx(cacheKey, 300, JSON.stringify(userFromDb));

  return userFromDb;
}

Ключевые аспекты для проектирования:

  • Стратегия инвалидации: Как и когда данные в кэше становятся неактуальными (TTL, инвалидация по событию).
  • Выбор TTL (Time To Live): Баланс между актуальностью данных и нагрузкой на источник.
  • Риски: Устаревшие данные (stale data), повышенное потребление памяти, сложность отладки.