Этот вопрос проверяет понимание принципов кеширования и практического применения Redis для повышения производительности приложений.
Redis используется как кеш-слой между приложением и основной базой данных для хранения часто запрашиваемых данных в оперативной памяти. Это позволяет значительно ускорить чтение данных и снизить нагрузку на основную БД. Redis хранит данные в формате ключ-значение с поддержкой различных структур данных. Кеширование особенно эффективно для редко изменяющихся данных, результатов сложных вычислений и сессий пользователей.
Redis — это хранилище структур данных в памяти, которое часто используется как кеш.
Кеширование результатов запросов: Сохранение результатов частых SQL-запросов
Хранение сессий: Быстрый доступ к данным сессии пользователя
Кеширование страниц: Сохранение готового HTML или фрагментов страниц
Счетчики и метрики: Быстрые инкрементальные операции
import redis
import json
import psycopg2
from functools import wraps
# Подключение к Redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)
def cache_result(ttl=300): # TTL в секундах
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# Создаем ключ на основе аргументов функции
cache_key = f"{func.__name__}:{str(args)}:{str(kwargs)}"
# Пытаемся получить данные из кеша
cached_data = redis_client.get(cache_key)
if cached_data:
return json.loads(cached_data)
# Если нет в кеше, выполняем функцию
result = func(*args, **kwargs)
# Сохраняем результат в кеш
redis_client.setex(cache_key, ttl, json.dumps(result))
return result
return wrapper
return decorator
# Использование декоратора
@cache_result(ttl=600) # Кешируем на 10 минут
def get_user_orders(user_id):
# Медленный запрос к базе данных
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("""
SELECT o.id, o.total, o.created_at
FROM orders o
WHERE o.user_id = %s
ORDER BY o.created_at DESC
""", (user_id,))
return cur.fetchall()TTL (Time To Live): Автоматическое удаление по истечении времени
Явная инвалидация: Удаление кеша при изменении данных
Write-through: Обновление кеша одновременно с обновлением в БД
Cache-aside: Приложение само управляет загрузкой в кеш
def update_user_profile(user_id, data):
# Обновляем данные в основной БД
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("UPDATE users SET name = %s WHERE id = %s",
(data['name'], user_id))
conn.commit()
# Инвалидируем кеш
cache_key = f"get_user_profile:{user_id}"
redis_client.delete(cache_key)
# Также можно обновить кеш
redis_client.setex(cache_key, 3600, json.dumps(data))Вывод: Redis — мощный инструмент для кеширования, который может значительно улучшить производительность приложения. Используйте его для данных, которые часто читаются но редко изменяются. Не забывайте про стратегии инвалидации кеша и мониторинг использования памяти.