Что такое кэш (cache) в программировании?

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

Ответ

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

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

Типы и примеры:

  • CPU Cache: Встроенная в процессор память для ускорения доступа к инструкциям и данным.
  • Браузерный кэш: Хранит статичные ресурсы (изображения, CSS, JS) для ускорения загрузки страниц.
  • Серверный кэш (in-memory): Например, Redis или Memcached для кэширования результатов запросов к БД или сессий пользователей.

Пример кэширования в Python с использованием functools.lru_cache:

from functools import lru_cache
import time

# Без кэша - функция будет вычисляться каждый раз
def expensive_query(user_id):
    time.sleep(2)  # Имитация долгого запроса к БД
    return f"Data for user {user_id}"

# С кэшем - результат для каждого user_id сохраняется
@lru_cache(maxsize=128)
def cached_query(user_id):
    time.sleep(2)
    return f"Data for user {user_id}"

# Первый вызов - 2 секунды
print(cached_query(1))  # Вычисление
# Второй вызов с тем же аргументом - мгновенно из кэша
print(cached_query(1))  # Возврат из кэша
# Вызов с новым аргументом - снова вычисление
print(cached_query(2))  # Вычисление

Ключевые проблемы и стратегии:

  1. Несогласованность (Inconsistency): Данные в кэше могут устареть. Решения: TTL (Time To Live), инвалидация при записи, использование паттернов like Cache-Aside.
  2. Вытеснение (Eviction): При заполнении кэша нужно решать, какие данные удалять. Алгоритмы: LRU (Least Recently Used), LFU (Least Frequently Used).
  3. Проблема "Cache Stampede": Одновременный сброс кэша у многих экземпляров, ведущий к лавинообразной нагрузке на источник. Решение: рандомизация TTL или блокировки (mutex).