К основному содержанию
скилл GitHub Copilot официальный · GitHub

upstash-redis — скилл для GitHub Copilot: что делает и как установить

Скилл настраивает Redis через HTTP для бессерверных сред и добавляет лимитер запросов с помощью библиотек @upstash/redis и @upstash/ratelimit.

Установить в GitHub Copilot · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add github/awesome-copilot --skill upstash-redis
Открыть на GitHub

Что делает upstash-redis

Пакет помогает агенту работать с Upstash Redis в проектах на Next.js, Cloudflare Workers или Vercel без управления пулом TCP-соединений. Внутри собраны готовые сценарии для кэширования с TTL (cache-aside), сессий со скользящим сроком жизни и ограничения частоты запросов через алгоритмы sliding window или token bucket.

Каждая операция выполняется отдельным HTTP-запросом через глобальный fetch. Клиент автоматически сериализует объекты и массивы, поэтому вызывать JSON.stringify перед записью не нужно. Для работы требуются база данных Upstash и переменные окружения UPSTASH_REDIS_REST_URL и UPSTASH_REDIS_REST_TOKEN.

Если вы пишете API на edge-рантаймах, этот скилл избавит от проблем с обрывом сетевых сокетов. Для долгоживущих серверов со стандартным клиентом ioredis или для задач векторного поиска он не подходит.

Какие задачи решает

  • настроить кэширование cache-aside с TTL в serverless-функциях
  • ограничить частоту запросов со статусом 429 в маршрутах Next.js
  • организовать хранилище сессий со скользящим сроком жизни
  • подключить Redis через HTTP без пула TCP-соединений

Примеры запросов агенту

  • Добавь рейт-лимитер sliding window на 10 запросов в route handler Next.js через Upstash
  • Настрой кэширование функции getUser с TTL в один час через @upstash/redis
  • Сделай хранение сессий в Redis со скользящим временем жизни на 24 часа

Как установить upstash-redis

1Через Skills CLI (Vercel)

npx skills add github/awesome-copilot --skill upstash-redis

2GitHub CLI

gh skill install github/awesome-copilot upstash-redis

3Вручную: положить файлы

.github/skills/upstash-redis/SKILL.md

Из того же набора554

Весь набор →
git-commit официальный github Скилл разбирает изменения Git, выбирает связанные файлы и создаёт коммит в формате Conventional Commits. Пригодится, когда нужно закоммитить одну или несколько логических частей изменений. GitHub Copilot 47 165установок excalidraw-diagram-generator официальный github Скилл превращает описание на обычном языке в диаграмму Excalidraw. Подойдёт, когда нужно показать процесс, связи между объектами или устройство системы. GitHub Copilot 31 639установок multi-stage-dockerfile официальный github Скилл помогает создавать многоэтапные Dockerfile для разных языков и фреймворков. Пригодится, когда важны размер и состав runtime-образа. GitHub Copilot 29 688установок documentation-writer официальный github Скилл для создания технической документации по фреймворку Diátaxis: туториалы, гайды, справки и объяснения. Предлагает структуру перед написанием. GitHub Copilot 27 757установок prd официальный github Собирает из идеи структурированный PRD с пользовательскими историями, техническими требованиями и рисками. Подходит для планирования новых функций, в том числе с AI. GitHub Copilot 24 035установок refactor официальный github Скилл помогает менять структуру кода без изменения внешнего поведения. Подойдёт для постепенной уборки сложных функций, дублирования и кодовых запахов. GitHub Copilot 22 321установок java-springboot официальный github Задаёт практики разработки Spring Boot-приложений: от структуры проекта до тестов и безопасности. Пригодится, когда Copilot пишет или проверяет Java-код. GitHub Copilot 21 272установок create-readme официальный github Скилл изучает проект и создаёт структурированный README.md. Подойдёт, когда документацию нужно собрать по коду и файлам проекта. GitHub Copilot 19 081установок

Похожие

stripe-best-practices официальный Stripe Рекомендации по интеграции Stripe для Codex: выбор API, настройка подписок, налогов и безопасность ключей. CX Codex GP ChatGPT 36установок stripe-best-practices официальный OpenAI Скилл подсказывает, какие API Stripe выбрать для платежей, подписок, маркетплейса и финансовых счетов. Пригодится при разработке и ревью интеграций. CX Codex GP ChatGPT 36установок chatgpt-app-submission официальный OpenAI Проверяет MCP-сервер ChatGPT Apps и готовит файл для подачи приложения. Пригодится перед ревью, когда нужно собрать подсказки, тесты и замечания. CX Codex GP ChatGPT 29установок uml-and-software-architecture-visualization официальный OpenAI Скилл помогает выбрать нотацию и формат для UML-диаграмм, схем архитектуры, процессов и данных. Подключайте его, когда нужно описать структуру или поведение системы. CX Codex GP ChatGPT 24установок cloud-solution-architect microsoft Превращает ИИ-агента в архитектора облачных решений по стандартам Azure Architecture Center. Помогает выбирать архитектурные стили и проверять дизайн систем по правилам WAF. Claude Code GitHub Copilot 117установок ai-sdk официальный Vercel Labs Скилл настраивает работу агента с Vercel AI SDK. Он помогает писать код для чатов, генерации текста, вызова инструментов и сборки агентов без устаревших методов. CX Codex GP ChatGPT 22установок mcp-builder официальный anthropics Скилл проводит через создание MCP-сервера на TypeScript или Python: от изучения протокола до тестов и оценки качества. Claude Code Claude.ai 130 949установок google-agents-cli-adk-code официальный Google Скилл даёт примеры и справку по Agent Development Kit: агентам, инструментам, колбэкам, состоянию и графовым workflow. Нужен при написании кода. Claude Code CX Codex Cursor +1 511 400установок

Вопросы о upstash-redis

Как установить upstash-redis в GitHub Copilot?

Выполните команду npx skills add github/awesome-copilot --skill upstash-redis в терминале или сохраните файл по пути .github/skills/upstash-redis/SKILL.md.

Зачем использовать Upstash Redis вместо ioredis?

Клиент Upstash работает поверх HTTP. Это решает проблему платформ вроде Vercel и Cloudflare Workers, где нельзя удерживать постоянные TCP-соединения.

Нужно ли вручную вызывать JSON.stringify перед сохранением данных?

Нет. Библиотека @upstash/redis выполняет сериализацию и парсинг объектов автоматически, а повторный парсинг приведет к ошибке.

Исходный текст

SKILL.md · MIT
---
name: upstash-redis
description: >
  Use Redis over HTTP from serverless and edge runtimes with @upstash/redis, and
  add rate limiting with @upstash/ratelimit. Use when the user mentions Upstash
  Redis, needs Redis from a Next.js route handler or middleware, Vercel,
  Cloudflare Workers, Deno, or Bun without TCP connection pooling, or wants
  cache-aside with TTLs, a session store, counters, or a 429 rate limiter using
  fixed window, sliding window, or token bucket. DO NOT use for self-hosted or
  TCP Redis clients (ioredis, node-redis), Redis Cluster administration, or
  vector similarity search.
license: MIT
compatibility: "@upstash/redis 1.x, @upstash/ratelimit 2.x, Node.js 18+ or any runtime with global fetch"
metadata:
  author: Upstash
---

# Upstash Redis Skill

This skill covers the three things serverless apps most often need Redis for:
caching, sessions, and rate limiting. The client talks to Redis over HTTP, so
it works where a long-lived TCP connection does not (edge middleware, short
lived functions). Follow the steps in order; each ends with a checkpoint.

## Requirements and limitations

- An Upstash Redis database (hosted service; usage-based pricing with a free
  tier). Credentials are a REST URL and token from the database page.
- Environment variables `UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN`.
- Every command is an HTTP request. Batch with `pipeline()` or `MGET`/`MSET`
  when you issue many commands per request; avoid `KEYS *` in production.
- Values are serialized automatically (objects, arrays, numbers round-trip).
  Do not `JSON.stringify` before `set` or `parseInt` after `get`.

## Step 1 — Install and create one client per module

```bash
npm install @upstash/redis @upstash/ratelimit
```

```ts
// lib/redis.ts
import { Redis } from "@upstash/redis";

// Reads UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN
export const redis = Redis.fromEnv();
```

Create the client at module scope, not inside the request handler, so
ephemeral caches and pipelines can be reused across invocations.

> **Checkpoint**: `await redis.ping()` returns `"PONG"`.

## Step 2 — Cache-aside with TTL

```ts
import { redis } from "@/lib/redis";

type User = { id: string; name: string; plan: "free" | "pro" };

export async function getUser(userId: string): Promise<User | null> {
  const key = `user:${userId}`;
  const cached = await redis.get<User>(key);
  if (cached) return cached;

  const user = await db.users.findById(userId); // your data source
  if (user) await redis.set(key, user, { ex: 3600 }); // 1 hour TTL
  return user;
}

export async function updateUser(userId: string, patch: Partial<User>) {
  const user = await db.users.update(userId, patch);
  await redis.set(`user:${userId}`, user, { ex: 3600 }); // write-through
  return user;
}

export async function deleteUser(userId: string) {
  await db.users.delete(userId);
  await redis.del(`user:${userId}`); // invalidate
}
```

Always set a TTL on cache entries; namespace keys (`user:123`, `session:abc`).

> **Checkpoint**: second call to `getUser` returns without hitting the database
> and `await redis.ttl("user:123")` is positive.

## Step 3 — Sessions with sliding expiration

```ts
import { redis } from "@/lib/redis";

const SESSION_TTL = 60 * 60 * 24; // 24 hours

export async function createSession(userId: string, data: Record<string, unknown>) {
  const sessionId = crypto.randomUUID();
  await redis.set(`session:${sessionId}`, { userId, ...data, createdAt: Date.now() }, { ex: SESSION_TTL });
  return sessionId;
}

export async function getSession<T = Record<string, unknown>>(sessionId: string) {
  const session = await redis.get<T>(`session:${sessionId}`);
  if (session) await redis.expire(`session:${sessionId}`, SESSION_TTL); // slide
  return session;
}

export async function destroySession(sessionId: string) {
  await redis.del(`session:${sessionId}`);
}
```

Store the session id in an `HttpOnly; Secure; SameSite` cookie; never put the
Redis token in client code.

> **Checkpoint**: `getSession` after `createSession` returns the object with
> `userId`; after `destroySession` it returns `null`.

## Step 4 — Rate limiting a route handler

```ts
// app/api/search/route.ts (Next.js App Router; same pattern for any fetch handler)
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";

const ratelimit = new Ratelimit({
  redis: Redis.fromEnv(),
  limiter: Ratelimit.slidingWindow(10, "10 s"), // 10 requests per 10 seconds
  prefix: "ratelimit:search", // isolate keys per limiter
});

export async function POST(request: Request) {
  const ip = request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ?? "anonymous";
  const { success, limit, remaining, reset } = await ratelimit.limit(ip);

  if (!success) {
    return new Response("Too Many Requests", {
      status: 429,
      headers: {
        "X-RateLimit-Limit": String(limit),
        "X-RateLimit-Remaining": String(remaining),
        "Retry-After": String(Math.max(0, Math.ceil((reset - Date.now()) / 1000))),
      },
    });
  }

  // handle the request
  return Response.json({ ok: true });
}
```

- Identifier: use the user id or API key when authenticated; fall back to IP.
- Algorithms: `Ratelimit.fixedWindow(n, "1 m")` (cheapest), `slidingWindow`
  (smooth boundaries, default choice), `tokenBucket(refill, "10 s", max)`
  (allows bursts). Windows accept `ms`, `s`, `m`, `h`, `d`.
- Tiers: create one `Ratelimit` per tier with different `prefix` values.
- Edge middleware / Cloudflare Workers with `analytics: true`: the result has a
  `pending` promise; pass it to `context.waitUntil(pending)` so background work
  finishes before the runtime exits.
- `reset` is a Unix timestamp in milliseconds.

> **Checkpoint**: the 11th request within 10 seconds returns 429 with a
> `Retry-After` header; after the window it succeeds again.

## Common pitfalls

- **Creating clients inside handlers**: the limiter's in-memory
  `ephemeralCache` only helps when the instance outlives the request.
- **Manual JSON**: `redis.set("k", JSON.stringify(v))` then `redis.get` returns
  an already-parsed object; double parsing throws.
- **No TTL on cache keys**: memory grows until eviction; always pass `{ ex }`.
- **Trusting `x-forwarded-for` blindly**: take the first hop, or use the
  platform's IP helper, when behind a proxy.
- **Forgetting `pending`** on edge runtimes with analytics or multi-region
  limiters.

## When NOT to use this skill

- Long-running servers with a TCP Redis connection already in place: keep
  ioredis/node-redis.
- Vector search or RAG: use a vector database skill instead.
- Sub-millisecond, in-process caching: use an in-memory LRU.

## References

- https://upstash.com/docs/redis/sdks/ts/overview
- https://upstash.com/docs/redis/sdks/ratelimit-ts/overview
- https://github.com/upstash/redis-js
- https://github.com/upstash/ratelimit-js

© Upstash · MIT · github/awesome-copilot

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой