JavaRush /Курсы /Модуль 4: FastAPI /Введение в кэширование: зачем оно нужно

Введение в кэширование: зачем оно нужно

Модуль 4: FastAPI
9 уровень , 0 лекция
Открыта

Кэширование – это как записная книжка для вашего приложения. Представьте, что вы каждый раз, чтобы узнать, который час, переноситесь на другой конец мира к самому точному атомному часам. Занимательно, но медленно. Вместо этого, вы смотрите на наручные часы – то же самое время, но быстрее.

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

Основные преимущества кэширования

  1. Скорость: данные в оперативной памяти можно прочитать за доли миллисекунды, в то время как запросы к базе данных занимают миллисекунды, а иногда и секунды.
  2. Снижение нагрузки на базу данных: когда кэш отвечает на запросы, база данных отдыхает. Это особенно важно для высоконагруженных систем.
  3. Улучшение пользовательского опыта: никто не любит долго ждать. Быстрее открывающиеся страницы и мгновенные ответы делают пользователей счастливыми.

Области применения кэширования

Кэширование приходит на помощь в самых популярных сценариях:

  • Часто используемые данные: например, настройки пользователей или популярные статьи на сайте.
  • Результаты частых вычислений: сложные и долгие вычисления можно сохранить в кэше и повторно использовать.
  • 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. А пока можете потренироваться на небольших примерах, чтобы закрепить сегодняшние идеи.

1
Задача
Модуль 4: FastAPI, 9 уровень, 0 лекция
Недоступна
Кэширование вычислений с использованием lru_cache
Кэширование вычислений с использованием lru_cache
1
Задача
Модуль 4: FastAPI, 9 уровень, 0 лекция
Недоступна
Еще одно кэширование вычислений с использованием lru_cache
Еще одно кэширование вычислений с использованием lru_cache
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ