Бэкенд

Redis: cache, очереди и locks без лишней сложности

Redis нужен там, где данные должны жить быстро и недолго: cache, rate limit, состояния бота, одноразовые токены, locks и очереди фоновых задач.

1. Cache с TTL

Не кешируй всё подряд. Кешируй только то, что часто читается и редко меняется.

cache_key = "project:list:ru"
cached = redis.get(cache_key)
if cached:
    return json.loads(cached)

data = load_from_database()
redis.setex(cache_key, 300, json.dumps(data))

2. Rate limit

Для Telegram-ботов и API endpoints можно ограничивать частые запросы по user_id или IP.

key = f"rate:user:{user_id}"
count = redis.incr(key)
if count == 1:
    redis.expire(key, 60)
if count > 30:
    raise TooManyRequests()

3. Distributed lock

Lock нужен, чтобы одна задача не обработалась два раза параллельно.

lock = redis.set("lock:import", "1", nx=True, ex=120)
if not lock:
    return "already running"
try:
    run_import()
finally:
    redis.delete("lock:import")

4. Очередь задач

Если операция долгая, не держи HTTP request открытым. Положи задачу в queue и обработай worker’ом.

  1. API принимает запрос.
  2. Создаёт job_id.
  3. Кладёт payload в Redis queue.
  4. Worker выполняет задачу.
  5. Frontend или бот получает статус.

5. Нейминг ключей

Ключи должны читаться человеком. Хороший формат: область, сущность, идентификатор и язык/тип, если нужно. Так легче чистить cache точечно и искать проблему в production.

project:list:ru
project:item:4302:ru
rate:user:12345
lock:import:real-estate-feed

6. Cache invalidation

Самая частая ошибка — обновить данные в базе и забыть очистить cache. Для простого проекта используй короткий TTL. Для админки и каталога добавь явную очистку при сохранении объекта.

  1. После обновления объекта удаляй project:item:{id}.
  2. После импорта удаляй списки каталога.
  3. Для SEO-страниц держи отдельный ключ по URL.

7. Persistence и память

Redis быстрый, но его нельзя превращать в единственное хранилище важных данных. Очереди и cache можно восстановить, а платежи, заявки и пользователи должны жить в основной базе.

redis-cli info memory
redis-cli keys "project:*"
redis-cli ttl project:list:ru

Checklist

  • У каждого cache key есть TTL.
  • Locks имеют expire, чтобы не зависнуть навсегда.
  • Redis не используется как единственная база важных данных.
  • Очереди логируют ошибки задач.
  • Есть мониторинг памяти Redis.
Все постыСледующая инструкция