Кэширование – это как записная книжка для вашего приложения. Представьте, что вы каждый раз, чтобы узнать, который час, переноситесь на другой конец мира к самому точному атомному часам. Занимательно, но медленно. Вместо этого, вы смотрите на наручные часы – то же самое время, но быстрее.
Кэширование – это процесс сохранения часто используемых данных в быстром хранилище (например, в оперативной памяти), чтобы сократить время доступа к ним в будущем. Вместо обращения к медленному ресурсу, такому как база данных или внешняя API, ваше приложение быстро "смотрит в записную книжку" – в кэш.
Основные преимущества кэширования
- Скорость: данные в оперативной памяти можно прочитать за доли миллисекунды, в то время как запросы к базе данных занимают миллисекунды, а иногда и секунды.
- Снижение нагрузки на базу данных: когда кэш отвечает на запросы, база данных отдыхает. Это особенно важно для высоконагруженных систем.
- Улучшение пользовательского опыта: никто не любит долго ждать. Быстрее открывающиеся страницы и мгновенные ответы делают пользователей счастливыми.
Области применения кэширования
Кэширование приходит на помощь в самых популярных сценариях:
- Часто используемые данные: например, настройки пользователей или популярные статьи на сайте.
- Результаты частых вычислений: сложные и долгие вычисления можно сохранить в кэше и повторно использовать.
- API-ответы: если внешний API предоставляет неизменяемую информацию (например, погодные данные на конкретный день), можно закэшировать результат и не дергать API постоянно.
- Статические ресурсы: HTML-страницы, изображения и другие файлы можно кэшировать и раздавать быстрее.
Представьте интернет-магазин. У нас есть страница с карточкой товара. Каждый раз, когда пользователь заходит на страницу, делается запрос к базе данных, чтобы загрузить информацию о товаре, цены и отзывы. Но что если информация о товаре редко меняется? Мы можем закэшировать её и возвращать пользователю за доли секунды!
Примеры использования кэширования
Давайте разберем несколько реальных примеров, чтобы понять, где кэширование может быть полезным.
Пример 1: кэширование ответов API
Предположим, наш FastAPI-приложение получает курс валют из внешнего API. Запросы к этому API занимают по 1-2 секунды, и это ужасно сказывается на нашем отклике.
import requests
from time import time
# Пример API-запроса без кэша
def get_exchange_rate():
start = time()
response = requests.get("https://api.exchangerate-api.com/v4/latest/USD")
print(f"Ответ получен за {time() - start} секунд")
return response.json()
Теперь представим, что мы добавили кэширование, чтобы обращаться к внешнему API только раз в час:
from cachetools import TTLCache
# Создаем кэш с 2 элементами и временем жизни 3600 секунд (1 час)
cache = TTLCache(maxsize=2, ttl=3600)
def get_exchange_rate():
if "exchange_rate" in cache:
return cache["exchange_rate"]
response = requests.get("https://api.exchangerate-api.com/v4/latest/USD")
cache["exchange_rate"] = response.json()
return cache["exchange_rate"]
Теперь при каждом следующем вызове функции данные будут доставляться мгновенно из кэша, а не из жадного внешнего API.
Пример 2: кэширование статических ресурсов и страниц
Кэшировать можно не только данные, но и целые HTML-страницы. Например, WordPress активно использует кэширование, чтобы страницы блога не рендерились заново при каждом запросе. Это существенно снижает нагрузку на сервер.
Пример 3: кэширование вычислений
Представим, что у нас есть сложная математическая функция:
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
Расчет 40-го числа Фибоначчи занимает приличное время. Мы можем ускорить процесс с помощью мемоизации (одной из форм кэширования).
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
Теперь результаты вычислений будут сохранены, и повторные вызовы функции станут мгновенными.
Заключение: зачем вам это знать?
В реальной работе разработчика кэширование – это не опция, а необходимость. Быстродействие вашего приложения может стать ключевым фактором успеха, а кэширование – ваш главный инструмент в борьбе за миллисекунды.
Вы будете использовать кэширование для:
- Ускорения API.
- Создания масштабируемых систем, которые не ломаются под нагрузкой.
- Оптимизации вычислений и сложных запросов.
В следующей лекции мы познакомимся с Redis – мастером кэширования и не только. Redis станет нашим главным союзником в борьбе за скорость и производительность. После неё мы начнем устанавливать его и подключать к FastAPI. А пока можете потренироваться на небольших примерах, чтобы закрепить сегодняшние идеи.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ