Pular para o conteúdo
Skillpedia
APIs e servidores (backend)40 mil · #5410

upstash-redis

Ajuda seu agente a usar o Redis como um banco de dados rápido e em memória. É útil para armazenar dados temporários, como sessões de usuário ou contadores, e para limitar o número de requisições que um usuário pode fazer.

O que ela faz

Esta ferramenta permite que você use o banco de dados Redis através da internet, sem precisar de conexões complicadas. É útil para guardar informações temporárias (cache), gerenciar sessões de usuários e limitar quantas vezes algo pode ser feito em um certo período (rate limiting).

Quando usar

  • ✓Quando você precisa guardar dados temporariamente para acesso rápido.
  • ✓Para gerenciar o login e as informações de cada usuário conectado.
  • ✓Para evitar que um usuário abuse de uma funcionalidade, limitando o número de requisições.

Exemplo do que pedir para a IA

“Configure o limite de requisições para 10 por minuto para a página de login.”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/github/awesome-copilot/blob/main/skills/upstash-redis/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/github/awesome-copilot/blob/main/skills/upstash-redis/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

A ferramenta funciona enviando comandos para o Redis via requisições web (HTTP). Ela é configurada com credenciais que você obtém do serviço Upstash Redis.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

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

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/github/awesome-copilot/main/skills/upstash-redis/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Skill Upstash Redis

Esta skill cobre as três coisas que aplicativos serverless mais precisam do Redis: cache, sessões e limitação de taxa. O cliente se comunica com o Redis via HTTP, portanto, funciona onde uma conexão TCP de longa duração não funciona (middleware de borda, funções de curta duração). Siga as etapas em ordem; cada uma termina com um ponto de verificação.

Requisitos e limitações

  • Um banco de dados Upstash Redis (serviço hospedado; preços baseados no uso com um nível gratuito). As credenciais são uma URL REST e um token da página do banco de dados.
  • Variáveis de ambiente UPSTASH_REDIS_REST_URL e UPSTASH_REDIS_REST_TOKEN.
  • Cada comando é uma requisição HTTP. Use batch com pipeline() ou MGET/MSET quando você emite muitos comandos por requisição; evite KEYS * em produção.
  • Os valores são serializados automaticamente (objetos, arrays, números retornam como foram). Não JSON.stringify antes de set ou parseInt depois de get.

Etapa 1 — Instalar e criar um cliente por módulo

npm install @upstash/redis @upstash/ratelimit
// lib/redis.ts
import { Redis } from "@upstash/redis";

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

Crie o cliente no escopo do módulo, não dentro do manipulador de requisição, para que caches efêmeros e pipelines possam ser reutilizados entre invocações.

Ponto de verificação: await redis.ping() retorna "PONG".

Etapa 2 — Cache-aside com TTL

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
}

Sempre defina um TTL para entradas de cache; namespace de chaves (user:123, session:abc).

Ponto de verificação: a segunda chamada para getUser retorna sem acessar o banco de dados e await redis.ttl("user:123") é positivo.

Etapa 3 — Sessões com expiração deslizante

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}`);
}

Armazene o ID da sessão em um cookie HttpOnly; Secure; SameSite; nunca coloque o token do Redis no código do cliente.

Ponto de verificação: getSession após createSession retorna o objeto com userId; após destroySession ele retorna null.

Etapa 4 — Limitação de taxa de um manipulador de rota

// 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 });
}
  • Identificador: use o ID do usuário ou a chave de API quando autenticado; use o IP como fallback.

…

Perguntas frequentes

Preciso instalar algo?

Sim, você precisa instalar as bibliotecas `@upstash/redis` e `@upstash/ratelimit` usando um gerenciador de pacotes como o npm.

O que são 'environment variables'?

São variáveis de ambiente onde você guarda informações sensíveis como senhas ou chaves de acesso, como a URL e o token do Upstash Redis, para que não fiquem expostas no código.

Posso usar isso em qualquer lugar?

Funciona bem em ambientes serverless e edge (como Vercel, Cloudflare Workers), onde conexões de rede persistentes podem ser um problema. Não é ideal se você já tem uma conexão TCP Redis estabelecida em um servidor tradicional.

Detalhes

Descrição original do autor

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, slidin

repo: github/awesome-copilot

Popularidade

Estrelas no GitHub
40 mil
Posição no ranking
#5410
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas