技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
upstash-redis【数据与研究】Use the @upstash/redis HTTP client for caching, sessions, counters, and Redis data structures from serverless and edge runtimes without connection pooling.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
@upstash/redis is a Redis client that talks to an Upstash Redis database over
HTTPS instead of a TCP connection. Because every command is a stateless HTTP
request, it works in environments where a pooled TCP client is awkward or
impossible: Vercel and Netlify functions, Cloudflare Workers, Deno, Bun, and
Next.js middleware. The client serializes and deserializes JavaScript values
automatically, so numbers and objects round-trip without manual JSON.parse.
UPSTASH_REDIS_REST_URL, or
@upstash/redis.ioredis or node-redis call site to a runtime that
cannot hold a persistent TCP socket.ioredis or node-redis there.redis-cli.Create a database in the Upstash console and copy the REST URL and token into environment variables. Never hardcode them.
UPSTASH_REDIS_REST_URL=https://<your-db>.upstash.io
UPSTASH_REDIS_REST_TOKEN=<your-rest-token>
import { Redis } from "@upstash/redis";
export const redis = Redis.fromEnv();
On Cloudflare Workers, import from @upstash/redis/cloudflare and pass the
worker env object: Redis.fromEnv(env).
Command names are lowercase methods (get, set, hset, zadd, incr).
Values are auto-serialized; pass and receive native JavaScript types.
import { Redis } from "@upstash/redis";
const redis = Redis.fromEnv();
export async function getUser(id: string) {
const cached = await redis.get<{ id: string; name: string }>(`user:${id}`);
if (cached) return cached;
const user = await db.users.findById(id);
await redis.set(`user:${id}`, user, { ex: 3600 }); // expires in 1 hour
return user;
}
export async function invalidateUser(id: string) {
await redis.del(`user:${id}`);
}
const pipeline = redis.pipeline();
pipeline.hset("user:1", { name: "Alice", plan: "pro" });
pipeline.incr("signups:total");
pipeline.zadd("leaderboard", { score: 120, member: "user:1" });
const [hsetResult, signups, zaddResult] = await pipeline.exec();
pipeline() batches independent commands into one round trip. It is not
atomic; use redis.multi() for MULTI/EXEC or a reviewed server-side Lua script
when commands must run as one unit.
Redis.fromEnv() or from a secrets manager.{ ex: seconds }) on cache entries so stale data expires.user:123, session:abc) to keep the keyspace readable.pipeline() or mget/mset instead of many sequential awaits.JSON.stringify values before set; the client already does it.keys("*") in request handlers; use scan for large keyspaces.multi()) do not roll back on runtime errors, and WATCH is
not available over REST; use a Lua script for atomic check-and-set.BLPOP, XREAD BLOCK) are not
supported over the REST client.flushdb and del are destructive; confirm with the user
before running them against a production database.get returns null in production but works locally.
Solution: The deployment is missing UPSTASH_REDIS_REST_URL or
UPSTASH_REDIS_REST_TOKEN; check the platform's environment settings.incr on a value set
with JSON.stringify.
Solution: Store the raw number (redis.set("n", 1)) and let the client
serialize it.@upstash-ratelimit - Rate limiting built on this client.@upstash-qstash - HTTP message queue and schedules when you need delivery
guarantees rather than a data store.@redis-cli - Inspecting and administering Redis from the command line.@bullmq-specialist - Job queues on a TCP Redis you operate yourself.