Ответ
Кэш — это высокоскоростной слой хранения данных, предназначенный для временного сохранения результатов вычислений или часто запрашиваемой информации. Его цель — сократить время доступа к данным и снизить нагрузку на более медленные источники (базы данных, внешние 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)) # Вычисление
Ключевые проблемы и стратегии:
- Несогласованность (Inconsistency): Данные в кэше могут устареть. Решения: TTL (Time To Live), инвалидация при записи, использование паттернов like Cache-Aside.
- Вытеснение (Eviction): При заполнении кэша нужно решать, какие данные удалять. Алгоритмы: LRU (Least Recently Used), LFU (Least Frequently Used).
- Проблема "Cache Stampede": Одновременный сброс кэша у многих экземпляров, ведущий к лавинообразной нагрузке на источник. Решение: рандомизация TTL или блокировки (mutex).