Для чего использовал Redis?

«Для чего использовал Redis?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я использовал Redis как высокопроизводительное хранилище структур данных в памяти (in-memory data structure store). Основные сценарии:

  1. Кэширование запросов к БД: Самый частый кейс. Redis хранит результаты тяжелых SQL-запросов, разгружая основную реляционную БД (например, PostgreSQL или MySQL) и ускоряя отклик приложения.
  2. Хранение сессий: Сессии пользователей хранятся в Redis с TTL (временем жизни), что позволяет легко масштабировать приложение на несколько инстансов (stateless-архитектура).
  3. Очереди задач: Использовал структуры данных List или Streams для организации простых очередей фоновых задач (например, для отправки email или обработки изображений).
  4. Реализация 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))