# Хранить данные для сортировки по популярности инструментов Идея выложить на Vercel и использовать Vercel KV (на базе Upstash Redis) — это отличный, рабочий и очень быстрый в реализации вариант. Для 150 инструментов объем данных будет крошечным, но здесь есть пара критически важных нюансов по лимитам, о которых нужно знать на старте, чтобы бесплатный тариф не отключился в первый же месяц. [1] ## ⚠️ Подводный камень: Лимиты Vercel KV на Free-тарифе На бесплатном тарифе (Hobby) для Vercel KV действуют следующие ограничения: [2] - 30 000 запросов в месяц (суммарно чтение + запись). - Ограничение около 3 000 запросов в день. [2, 3] Если делать запрос к базе на каждый просмотр страницы («посещение»), лимит в 30 тысяч улетит мгновенно при первой же паре сотен посетителей в день. ## 💡 Как сделать это правильно и бесплатно Чтобы не выйти за рамки лимитов, архитектуру нужно построить экономно: ## 1. Чтение: Сортировка на этапе сборки (ISR / SSG) Не нужно запрашивать KV из Edge-функции при каждом открытии сайта пользователем. - Используйте Incremental Static Regeneration (ISR) (если вы делаете на Next.js) или раз в сутки запускайте Cron-сид (Vercel Cron). - Сайт раз в несколько часов запрашивает весь список из KV (всего 1 запрос на получение общей структуры), сортирует инструменты и кеширует эту страницу как статическую. - Результат: 100 000 пользователей увидят отсортированный список, а вы потратите всего пару запросов к KV в день. ## 2. Запись: Защита от накрутки и экономия («Добавление в избранное») «Избранное» — идеальная метрика для KV, так как её нажимают редко. А вот «Посещения» лучше отправлять не на каждый клик, а пачками (батчингом) или использовать для просмотров бесплатную Vercel Web Analytics (там лимит 25 000 событий в месяц обновляется отдельно). --- ## 💻 Оптимальная структура данных в Redis (KV) Вместо 150 отдельных ключей, храните всё в одной хэш-таблице (Hash) или сортированном множестве (Sorted Set). Это сэкономит количество запросов. Вариант структуры через Hash: ```js // Запись / инкремент (в API роуте Vercel) import { kv } from "@vercel/kv"; //Когда пользователь зашел на инструмент 'crop-png' await kv.hincrby("tools:visits", "crop-png", 1); // Когда добавил в избранное await kv.hincrby("tools:favorites", "crop-png", 1); ``` Как забрать всё одним запросом для сортировки: ```js // Получаем сразу все просмотры (вернет объект вида { 'crop-png': '120', 'resize-png': '85' }) const allVisits = await kv.hgetall("tools:visits"); const allFavorites = await kv.hgetall("tools:favorites"); // Дальше соединяем в массив на клиенте/сервере и сортируем: // Популярность = Просмотры + (Избранное * 5) <- так лайки весят больше ``` ## ⚡ Альтернатива: Cloudflare Workers + KV Если вы боитесь упереться в 30 000 запросов на Vercel, рассмотрите связку Cloudflare Workers + Workers KV. Там на бесплатном тарифе дают: [4] - 100 000 запросов на запись в сутки. - 10 000 000 (10 млн) запросов на чтение в сутки. - Для пет-проекта этого хватит навсегда, даже если вы будете делать запросы напрямую с фронтенда без кеширования.