mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-09-14 21:46:35 +00:00
78 lines
4.9 KiB
Markdown
78 lines
4.9 KiB
Markdown
# Хранить данные для сортировки по популярности инструментов
|
|
|
|
Идея выложить на 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 млн) запросов на чтение в сутки.
|
|
- Для пет-проекта этого хватит навсегда, даже если вы будете делать запросы
|
|
напрямую с фронтенда без кеширования.
|