Что такое кэширование запросов в контексте баз данных и приложений?

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

Ответ

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

Принцип работы:

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

Преимущества:

  • Ускорение отклика: Доступ к данным из памяти (например, Redis) в сотни раз быстрее, чем с диска или по сети.
  • Снижение нагрузки: Уменьшение числа обращений к базе данных или внешним сервисам.
  • Повышение отказоустойчивости: Кэш может служить буфером при временной недоступности основного источника данных.

Пример реализации в Spring (Java):

@Service
public class ProductService {
    @Cacheable(value = "products", key = "#id") // Аннотация для кэширования
    public Product getProductById(Long id) {
        // Этот метод выполнится только если результат
        // для данного 'id' отсутствует в кэше "products"
        return productRepository.findById(id) // Долгий запрос к БД
                .orElseThrow(() -> new EntityNotFoundException("Product not found"));
    }

    @CacheEvict(value = "products", key = "#id") // Аннотация для очистки кэша
    public void updateProduct(Product product) {
        productRepository.save(product);
        // После обновления старые данные удаляются из кэша
    }
}

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

  • Статичные или редко изменяющиеся справочники (список городов, категорий).
  • Результаты сложных агрегирующих запросов или отчётов.
  • Ответы от внешних API с лимитами на запросы.

Популярные решения: Redis, Memcached, Caffeine (in-memory cache для Java), Ehcache.