Как правильно кешировать запросы в Node.js REST API чтобы не положить базу
Рейтинг: 65.9% · 59 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- nina_pixel
- Сообщения: 2
- Зарегистрирован: Вс май 17, 2026 7:12 pm
Как правильно кешировать запросы в Node.js REST API чтобы не положить базу
Проблема: REST API на Node.js + Express + PostgreSQL. Один эндпоинт — тяжёлая аналитическая выборка, иногда до 3 секунд. Пользователей немного (~200 одновременно), но они долбят этот эндпоинт часто, у некоторых страница перезагружается каждые 30 секунд. База начинает задыхаться. Пробовал добавить Redis, но не понимаю правильную стратегию — когда инвалидировать кеш, как не отдавать протухшие данные.
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — nikita_stack
Для аналитических запросов с допустимой задержкой данных (а 30-секундный polling это явно допустимая задержка) — TTL-кеш в Redis это правильное решение. Ставишь TTL равным тому периоду за который данные допустимо устаревают. Если данные обновляются раз в 5 минут — TTL 5 минут. Простая схема: hit кеша — отдаёшь из Redis, miss — идёшь в базу, пишешь в Redis, отдаёшь клиенту. Сотни параллельных запр…
- nikita_stack
- Сообщения: 4
- Зарегистрирован: Вт май 26, 2026 3:08 pm
Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу
✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Для аналитических запросов с допустимой задержкой данных (а 30-секундный polling это явно допустимая задержка) — TTL-кеш в Redis это правильное решение. Ставишь TTL равным тому периоду за который данные допустимо устаревают. Если данные обновляются раз в 5 минут — TTL 5 минут. Простая схема: hit кеша — отдаёшь из Redis, miss — идёшь в базу, пишешь в Redis, отдаёшь клиенту. Сотни параллельных запросов превращаются в один запрос к БД каждые N минут.
- luka_crypto
- Сообщения: 27
- Зарегистрирован: Вс май 10, 2026 10:57 pm
Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу
Есть нюанс который называется cache stampede — когда TTL истекает и 50 запросов одновременно идут в базу. Решается через lock или через паттерн stale-while-revalidate: отдаёшь устаревшие данные сразу, в фоне обновляешь кеш. В node.js можно реализовать через simple-lru-cache или через Redis SET NX для distributed lock. Для 200 пользователей это не критично, но знать полезно.
Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу
Смотрел на твою схему — polling каждые 30 секунд это само по себе антипаттерн если данные меняются редко. Рассмотри Server-Sent Events или WebSocket с push-уведомлениями только при изменении данных. Меньше нагрузки, более актуальные данные, меньше головной боли с кешем. Node.js для этого отлично подходит.
- sqlreact9621
- Сообщения: 28
- Зарегистрирован: Вс май 10, 2026 9:45 pm
Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу
Конкретная реализация для Express + Redis (ioredis): пишешь middleware который по ключу (url + query params) проверяет Redis, если есть — res.json(cached), если нет — next() и в конце обработчика вызываешь redis.setex(key, ttlSeconds, JSON.stringify(result)). Ключ кеша важно делать детерминированным, иначе один и тот же логический запрос будет разными ключами. Ещё момент: не забудь что Redis хранит строки, JSON.parse/stringify обязателен.
Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу
А ещё посмотри на сам запрос — 3 секунды это очень долго. EXPLAIN ANALYZE в Postgres покажет где узкое место. Скорее всего не хватает индексов или нет материализованного представления для агрегатов. Кеш это хорошо, но если запрос можно ускорить до 100ms — часть проблемы уйдёт сама.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
- useEffect и массив зависимостей — линтер требует положить функцию, кладу — бесконечный цикл
9 ответов · 257 просмотров
-
-
-
-
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость