Как правильно кешировать запросы в Node.js REST API чтобы не положить базу

Рейтинг: 65.9% · 59 голосов
Frontend и backend разработка: JavaScript, TypeScript, React, Next.js, Vue, Node.js, PHP, REST и GraphQL API, вёрстка HTML/CSS и современные веб-приложения.
Ответить
Аватара пользователя
nina_pixel
Сообщения: 2
Зарегистрирован: Вс май 17, 2026 7:12 pm

Как правильно кешировать запросы в Node.js REST API чтобы не положить базу

Сообщение nina_pixel »

Проблема: REST API на Node.js + Express + PostgreSQL. Один эндпоинт — тяжёлая аналитическая выборка, иногда до 3 секунд. Пользователей немного (~200 одновременно), но они долбят этот эндпоинт часто, у некоторых страница перезагружается каждые 30 секунд. База начинает задыхаться. Пробовал добавить Redis, но не понимаю правильную стратегию — когда инвалидировать кеш, как не отдавать протухшие данные.
👍2 ❤️1 🔥2 😄1 🤔1
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — 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 чтобы не положить базу

Сообщение nikita_stack »

✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Для аналитических запросов с допустимой задержкой данных (а 30-секундный polling это явно допустимая задержка) — TTL-кеш в Redis это правильное решение. Ставишь TTL равным тому периоду за который данные допустимо устаревают. Если данные обновляются раз в 5 минут — TTL 5 минут. Простая схема: hit кеша — отдаёшь из Redis, miss — идёшь в базу, пишешь в Redis, отдаёшь клиенту. Сотни параллельных запросов превращаются в один запрос к БД каждые N минут.
👍1 ❤️ 🔥1 😄 🤔
Аватара пользователя
luka_crypto
Сообщения: 27
Зарегистрирован: Вс май 10, 2026 10:57 pm

Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу

Сообщение luka_crypto »

Есть нюанс который называется cache stampede — когда TTL истекает и 50 запросов одновременно идут в базу. Решается через lock или через паттерн stale-while-revalidate: отдаёшь устаревшие данные сразу, в фоне обновляешь кеш. В node.js можно реализовать через simple-lru-cache или через Redis SET NX для distributed lock. Для 200 пользователей это не критично, но знать полезно.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
luka4904
Сообщения: 31
Зарегистрирован: Вт май 12, 2026 2:53 pm

Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу

Сообщение luka4904 »

Смотрел на твою схему — polling каждые 30 секунд это само по себе антипаттерн если данные меняются редко. Рассмотри Server-Sent Events или WebSocket с push-уведомлениями только при изменении данных. Меньше нагрузки, более актуальные данные, меньше головной боли с кешем. Node.js для этого отлично подходит.
👍3 ❤️1 🔥2 😄 🤔1
Аватара пользователя
sqlreact9621
Сообщения: 28
Зарегистрирован: Вс май 10, 2026 9:45 pm

Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу

Сообщение sqlreact9621 »

Конкретная реализация для Express + Redis (ioredis): пишешь middleware который по ключу (url + query params) проверяет Redis, если есть — res.json(cached), если нет — next() и в конце обработчика вызываешь redis.setex(key, ttlSeconds, JSON.stringify(result)). Ключ кеша важно делать детерминированным, иначе один и тот же логический запрос будет разными ключами. Ещё момент: не забудь что Redis хранит строки, JSON.parse/stringify обязателен.
👍2 ❤️2 🔥1 😄1 🤔3
Аватара пользователя
liza_vue7
Сообщения: 1
Зарегистрирован: Вс май 17, 2026 11:41 pm

Re: Как правильно кешировать запросы в Node.js REST API чтобы не положить базу

Сообщение liza_vue7 »

А ещё посмотри на сам запрос — 3 секунды это очень долго. EXPLAIN ANALYZE в Postgres покажет где узкое место. Скорее всего не хватает индексов или нет материализованного представления для агрегатов. Кеш это хорошо, но если запрос можно ускорить до 100ms — часть проблемы уйдёт сама.
👍2 ❤️2 🔥2 😄1 🤔5
Ответить
Поделиться темой: ✈ Telegram VK

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость