Upstash
Upstash 是一个 **Serverless 数据平台**,它提供了托管的 **Redis** 和 **Kafka** 服务,专为现代无服务器 (Serverless)、边缘计算 (Edge Computing) 和微服务架构设计。它将高性能的内存数据存储(如 Redis)转化为按需付费、无连接管理压力的服务。
#tech / ops / database
#status / growing
#type / resource
#resource / upstash
[!info] related notes
Upstash
资源与参考(Resources)
- GitHub 示例
可以在 Upstash 的 GitHub 组织中找到针对不同框架(Next.js, Vercel, etc.)的快速开始和 Rate Limiter 示例。 - Upstash 博客
提供了大量关于 Serverless 缓存、速率限制和 Kafka 模式的教程和深度文章。
概览(Overview)
- 这是一个什么东西? Upstash 是一个 Serverless 数据平台,它提供了托管的 Redis 和 Kafka 服务,专为现代无服务器 (Serverless)、边缘计算 (Edge Computing) 和微服务架构设计。它将高性能的内存数据存储(如 Redis)转化为按需付费、无连接管理压力的服务。
- 它解决什么问题?适用场景是什么?
- 解决问题: 解决了传统 Redis 和 Kafka 需要持续运行、管理连接池、手动扩展、以及对 Serverless 架构支持不佳的问题。
- 适用场景:
- 缓存 (Caching): 最常见的用途,作为数据库的前置缓存。
- 会话存储 (Session Store): 在无状态应用中存储用户会话数据。
- 速率限制 (Rate Limiting): 使用 Redis 的原子操作实现高效的 API 访问限制。
- 实时排行榜/计数器: 利用 Redis 的 Sorted Sets 和原子增减操作。
- 消息队列/流处理: 使用 Upstash Kafka 或 Redis Streams 实现轻量级消息传递。
- 一句话总结 Upstash 是一个高性能、按需付费、支持 REST/HTTP 和传统连接的 Serverless Redis 和 Kafka 平台,是构建现代无服务器应用的首选数据层。
关键概念(Core Concepts)
- Serverless Data: Upstash 的核心理念。这意味着数据库可以像 Serverless Function 一样按需启动和停止。你只需为实际执行的命令付费,而不需要为闲置时间付费。
- REST API (对于 Redis): 除了传统的 TCP 连接,Upstash Redis 也支持通过标准的 HTTP/REST 接口进行命令操作。这解决了 Serverless Function(如 AWS Lambda 或 Vercel Edge)难以维持长连接的问题。
- Global Database: Upstash 允许你创建跨多个云区域部署的全球性数据库,通过复制和路由将数据存储在离用户最近的地方,从而实现低延迟。
- Data Persistence (持久化): Upstash 允许用户选择开启数据持久化,确保数据不会在内存重启或故障时丢失。
安装与环境准备(Installation / Setup)
Upstash 本身是云服务,无需本地安装服务器,主要是准备环境和配置客户端。
-
系统要求 任何支持 HTTP 请求或 TCP 连接的应用程序或环境(Node.js, Python, Go, 浏览器等)。
-
安装步骤(客户端)
- 注册账号: 访问 Upstash 官网并创建账户。
- 创建数据库: 在控制台选择创建 Redis 或 Kafka 数据库,选择区域和设置名称。
- 安装客户端: 在你的应用项目中安装支持 Redis 或 Kafka 协议的客户端库。
-
对于 Redis (Node.js):
npm install @upstash/redis # 推荐使用Upstash官方的REST客户端 # 或 npm install ioredis # 使用传统的TCP客户端
-
-
环境变量 / 配置说明 将 Upstash 控制台提供的连接信息配置到你的应用环境变量中:
| 变量名 | 作用 | 示例值 |
|---|---|---|
UPSTASH_REDIS_REST_URL | Redis 的 REST API 地址 | https://xxxx.upstash.io |
UPSTASH_REDIS_REST_TOKEN | 用于验证 REST API 请求的 Token | AzF_xxxxxxxxxxxxxxxxxx |
REDIS_URL | 传统的 TCP 连接字符串(如果使用 TCP) | redis://:<password>@host:port |
快速开始(Quick Start)
以使用 REST API 客户端 写入和读取一个键值对为例(适用于 Serverless 环境):
- 示例代码 / 指令
// index.js
import { Redis } from "@upstash/redis";
// 1. 从环境变量初始化客户端
const redis = new Redis({
url: process.env.UPSTASH_REDIS_REST_URL,
token: process.env.UPSTASH_REDIS_REST_TOKEN,
});
async function main() {
const key = "user:123:name";
const value = "Gemini";
// 2. 写入数据 (SET)
await redis.set(key, value);
console.log(`Set value for ${key} to: ${value}`);
// 3. 读取数据 (GET)
const storedValue = await redis.get(key);
console.log(`Retrieved value for ${key}: ${storedValue}`);
}
main();
- 基本使用流程
- 在 Upstash 创建一个 Redis 数据库并获取 REST URL 和 Token。
- 将 URL 和 Token 设置为环境变量。
- 在应用中导入
@upstash/redis库。 - 使用
new Redis({ url, token })初始化客户端。 - 直接调用 Redis 命令方法(如
redis.set(),redis.get(),redis.incr())。
进阶使用(Advanced Usage)
- 配置项说明
- TCP vs. REST: 在非 Serverless/VPC 环境中,可以选择使用传统 TCP 连接获得最低延迟。在 Serverless/Edge 环境中,必须使用 REST 连接。
- 区域选择: 靠近用户的区域可以最小化延迟。如果需要全球分布,可以选择 Global Database。
- 持久化: 在创建数据库时,可以选择开启持久化(付费功能)以确保数据可靠性。
- 常见模式(patterns)
- 速率限制 (Rate Limiting): 使用 Upstash 的内置或社区库(如 Vercel 的
@upstash/ratelimit)快速实现。 - Kafka Stream 处理: 使用 Upstash Kafka 作为消息总线,结合 Serverless Function 进行事件驱动的流处理。
- 无连接缓存: 适用于高性能的 Edge Computing 场景,客户端直接通过 REST 连接进行读写,无需管理连接池。
- 速率限制 (Rate Limiting): 使用 Upstash 的内置或社区库(如 Vercel 的
常见问题(FAQ)
- Q1: Upstash 免费套餐有什么限制? A1: 通常限制在存储大小(如 100 MiB)和每日命令数(如 10,000 次/天)。对于开发和小型项目来说通常足够。
- Q2: 为什么我的 Serverless Function 连接 Upstash 总是超时? A2: 检查你是否在 Serverless 环境(如 Lambda、Vercel Edge)中使用了 传统 TCP 连接。这些环境通常不允许或难以维持长连接,应切换使用 REST API 客户端。
排错指南(Debug / Troubleshooting)
- 常见报错 & 解决方法
401 Unauthorized:- 解决方法: 检查环境变量中的
UPSTASH_REDIS_REST_TOKEN是否正确且未过期。
- 解决方法: 检查环境变量中的
Connection refused/ 超时 (使用 TCP):- 解决方法: 确认你的运行环境(如本地或 VPC)是否能访问公网 IP,并确保防火墙没有阻止对 Upstash 主机和端口的连接。如果是在 Serverless 环境,请改用 REST API。
- 检查顺序
- 控制台状态: 检查 Upstash 控制台,确认数据库是否处于 Ready 状态。
- 环境变量: 确认
URL和TOKEN在你的应用中已正确加载。 - 连接方式: 确认是否在 Serverless 环境使用了 REST 客户端。
- 本地测试: 使用
curl命令(结合 REST URL 和 Token)在命令行测试连接是否正常。
最佳实践(Best Practices)
- 推荐的工作流 在开发环境使用 REST API(易于部署和测试),在需要极低延迟的核心服务中使用 TCP 连接(如果环境允许长期连接)。
- 性能注意点
- 使用 Pipelining: 当需要发送多个命令时,使用客户端的 Pipelining 功能将多个命令打包成一个请求发送,以减少网络延迟。
- 缓存策略: 为缓存键设置合理的 过期时间 (TTL),防止数据在内存中无限期积累。
📖 相关资源
- database-moc - 数据库 MOC
- neon-postgresql-cloud-deployment - Neon 云数据库
- supabase - Supabase