Ответ
Я использовал Redis как высокопроизводительное хранилище структур данных в памяти (in-memory data structure store). Основные сценарии:
- Кэширование запросов к БД: Самый частый кейс. Redis хранит результаты тяжелых SQL-запросов, разгружая основную реляционную БД (например, PostgreSQL или MySQL) и ускоряя отклик приложения.
- Хранение сессий: Сессии пользователей хранятся в Redis с TTL (временем жизни), что позволяет легко масштабировать приложение на несколько инстансов (stateless-архитектура).
- Очереди задач: Использовал структуры данных List или Streams для организации простых очередей фоновых задач (например, для отправки email или обработки изображений).
- Реализация rate-limiting: Счетчики в Redis с операцией INCR и TTL идеально подходят для ограничения количества запросов к API с определённого IP-адреса.
Пример кэширования результата SQL-запроса:
import redis
import psycopg2
import json
# Подключение к Redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)
# Формируем ключ кэша на основе параметров запроса
cache_key = f"top_products:{user_id}"
# Пытаемся получить данные из кэша
cached_data = redis_client.get(cache_key)
if cached_data:
products = json.loads(cached_data)
else:
# Если в кэше нет, идём в основную БД
conn = psycopg2.connect("dbname=shop user=postgres")
cur = conn.cursor()
cur.execute("SELECT id, name, price FROM products WHERE user_id = %s ORDER BY price DESC LIMIT 10", (user_id,))
products = cur.fetchall()
# Сохраняем результат в Redis на 5 минут
redis_client.setex(cache_key, 300, json.dumps(products))