Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: system design, redis, websocket

Как спроектировать систему учёта просмотров видео?

Проверяет умение проектировать высоконагруженные системы с учётом реального времени и минимизации нагрузки.

Короткий ответ

Система должна:

  1. Принимать просмотры через WebSocket для минимизации запросов.

  2. Хранить счетчики в Redis для быстрого обновления.

  3. Асинхронно сохранять данные в Postgres для аналитики.

  4. Отдавать ленту видео через HTTP с предзагруженными счетчиками.

Длинный ответ

Архитектура системы:

  1. Приём просмотров:

    • Клиент открывает WebSocket-соединение при старте приложения.

    • При просмотре видео отправляет событие: {"video_id": "abc", "user_id": "xyz"}.

    • Почему WebSocket? 1 соединение на сессию vs. HTTP-запрос на каждое видео.

  2. Обработка событий:

    • WebSocket-сервер (на Python/Node.js) принимает события.

    • Увеличивает счетчик в Redis:

      INCR video:abc:views
    • Почему Redis? Операции в памяти за O(1), поддержка 100k+ RPS.

  3. Синхронизация с БД:

    • Отдельный воркер раз в минуту переносит данные из Redis в Postgres:

      UPDATE videos SET views = views + 100 WHERE id = 'abc';
  4. Получение ленты видео:

    • Клиент запрашивает ленту через HTTP: GET /feed?limit=15.

    • Backend:

      • Достаёт 15 видео из Postgres.

      • За один запрос получает счетчики из Redis:

        MGET video:abc:views video:def:views ...

Оптимизации:

  • Кэширование счетчиков: Для видео в ленте — всегда Redis.

  • Батчинг: WebSocket-сервер накапливает события (например, 100 мс) и отправляет пачкой.

  • Шардирование Redis: При огромной нагрузке данные распределяются по кластеру.

Вывод:
Сочетание Redis (реал-тайм) + Postgres (постоянное хранение) + WebSocket (минимум запросов) решает задачу.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Python

    Python

Ключевые слова

#system design

#redis

#websocket

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.