Что такое кэширование? Как использовать Redis как кэш?
Подробный ответ
Что такое кэширование
Кэширование уменьшает число повторных запросов к медленным или дорогим источникам: основной базе данных, внешнему API, файловому хранилищу или сложным вычислениям. Кэш хранит готовый результат на ограниченное время.
Схема cache-aside
Приложение пытается получить значение по ключу из Redis.
Если значение найдено, приложение сразу возвращает его.
Если значения нет, приложение получает данные из основной базы.
Приложение сохраняет результат в Redis с временем жизни.
Следующие запросы используют данные из 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. После изменения данных удаляю или обновляю соответствующий ключ. При проектировании думаю не только о скорости, но и об инвалидации, сроке жизни и защите от одновременной загрузки одного значения в кэш.
Оцени свой прогресс