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

Ответ

Я использовал 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))

Ответ 18+ 🔞

А, блядь, про Redis! Ну это ж классика, ёпта. Ты представляешь, какая это удобная штука — по сути, оперативка для твоего приложения, только с мозгами. Я его на разные грабли насаживал, и он, сука, почти всегда выручал, если не накосячить с архитектурой.

Вот смотри, основные сцены применения, где он просто пиздец как хорош:

  1. Кэширование запросов к БД. Это святое, блядь. Самый частый кейс. У тебя там какой-нибудь монстр-SQL запрос, который жрёт ресурсы и тормозит как черепаха. Так ты его результат — раз! — и в Redis. Следующий раз данные отдаются мгновенно, основная база отдыхает. Просто волшебство, а не инструмент. PostgreSQL аж вздохнёт с облегчением, ей-богу.
  2. Хранение сессий. Тут тоже красота. Раньше сессии в файлы или в ту же базу пихали — ад и ужас при масштабировании. А с Redis — положил сессию по ключу, выставил TTL (время жизни, чтоб мусор не копился), и хоть на сотню серверов размазывай своё приложение. Все инстансы лезут в один Redis за состоянием пользователя. Элегантно, сука.
  3. Очереди задач. Ну, для простых сценариев — самое то. Нужно отправить письмо, сгенерировать отчёт или картинку обработать? Кидаешь задание в Redis-лист (или в Streams, если по-модному), а фоновый воркер её оттуда выгребает и исполняет. Главное — не делать на этом атомную электростанцию, для сложных очередей есть специализированные звери вроде RabbitMQ.
  4. Rate-limiting, или ограничение запросов. О, это я люблю. Какой-нибудь умник решил твой API ддосить или просто слишком активно стучаться. Берёшь Redis, делаешь ключ вида rate_limit:{ip_адрес}, и на каждый запрос делаешь INCR. Если перевалило за лимит — посылаешь лесом. И всё это с автоматическим сбросом через час (TTL проставил). Красота, ёбана!

Вот, смотри, живой пример, как кэш для SQL-запроса делается. Код не трогаю, как есть, но суть объясню:

import redis
import psycopg2
import json

# Подключаемся к нашему спасителю-редису
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, чтобы в следующий раз не париться.
    # setex — это set с expiration, то есть данные сами сдохнут через 300 секунд (5 минут).
    redis_client.setex(cache_key, 300, json.dumps(products))

Вот и вся магия, чувак. Главная хитрость — правильно ключи составлять и TTL адекватный выставлять, чтобы в кэше не лежало говно устаревшее. А так — инструмент огонь, ёбушки-воробушки, как же без него жили-то раньше. Сам от себя охуел, когда впервые скорость отклика в сто раз выросла. Прям терпения ноль ебать — хочется везде его теперь пихать. Но надо головой думать, э бошка думай, а то можно и накосячить.