PRO

Что такое кэширование? Как использовать Redis как кэш?

Кэширование — временное сохранение часто используемых или дорого вычисляемых данных, чтобы не получать их повторно из базы данных или внешнего сервиса. Redis используют как кэш по схеме cache-aside: сначала ищут значение в Redis, а при отсутствии получают из основного источника и сохраняют с ограниченным временем жизни.
Подробный ответ

Что такое кэширование

Кэширование уменьшает число повторных запросов к медленным или дорогим источникам: основной базе данных, внешнему API, файловому хранилищу или сложным вычислениям. Кэш хранит готовый результат на ограниченное время.

Схема cache-aside

  1. Приложение пытается получить значение по ключу из Redis.

  2. Если значение найдено, приложение сразу возвращает его.

  3. Если значения нет, приложение получает данные из основной базы.

  4. Приложение сохраняет результат в Redis с временем жизни.

  5. Следующие запросы используют данные из Redis, пока ключ не истечёт или не будет удалён.

import json


def get_article(article_id: int):
    cache_key = f'article:{article_id}'
    cached = redis_client.get(cache_key)

    if cached is not None:
        return json.loads(cached)

    article = repository.get_article(article_id)

    if article is None:
        return None

    redis_client.setex(
        cache_key,
        300,
        json.dumps(article),
    )

    return article

Ключи кэша

Ключ должен быть предсказуемым и отражать версию или параметры данных. Например: article:42, user:42:profile, search:v2:query:python:page:1.

Инвалидация кэша

Главная сложность кэширования — не сохранение, а обновление и удаление устаревших данных. При изменении статьи можно удалить ключ article:42, чтобы следующий запрос получил свежую версию из базы.

def update_article(article_id: int, data: dict):
    article = repository.update_article(article_id, data)
    redis_client.delete(f'article:{article_id}')
    return article

Типичные проблемы

  • устаревшие данные в кэше после обновления основной БД;

  • одновременные запросы при отсутствии ключа, создающие нагрузку на БД;

  • слишком большой срок жизни и неактуальные данные;

  • слишком короткий срок жизни и низкая польза кэша;

  • сохранение в кэше персональных или чувствительных данных без нужной защиты.

Как ответить на собеседовании

Кэширование хранит результат временно, чтобы уменьшить нагрузку на основное хранилище. В Redis обычно использую cache-aside: сначала читаю ключ, при отсутствии получаю данные из БД и сохраняю их с TTL. После изменения данных удаляю или обновляю соответствующий ключ. При проектировании думаю не только о скорости, но и об инвалидации, сроке жизни и защите от одновременной загрузки одного значения в кэш.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге