01
它是什么
一个托管的键值存储,每个项目一个,运行在自己的单元中:独立的进程、独立的内存上限、独立的存储。它由 Valkey 驱动,支持两种协议——HTTPS 之上的 Upstash REST 协议,以及连接层的 RESP——因此你手上已有的客户端无需修改就能使用。
它面向那些需要计数器而不是表的工作:限流、会话、队列、功能开关、短生命周期的缓存。这些 Postgres 都能做,只是没有一样能做得这么便宜。
CapyDB Knight/Valkyrie
一个键值存储和限流器,运行在自己的单元中,紧挨着你的数据,而且完全不用数据库也能很好地工作。
01
一个托管的键值存储,每个项目一个,运行在自己的单元中:独立的进程、独立的内存上限、独立的存储。它由 Valkey 驱动,支持两种协议——HTTPS 之上的 Upstash REST 协议,以及连接层的 RESP——因此你手上已有的客户端无需修改就能使用。
它面向那些需要计数器而不是表的工作:限流、会话、队列、功能开关、短生命周期的缓存。这些 Postgres 都能做,只是没有一样能做得这么便宜。
02
这就是全部的集成工作。两个环境变量,加上你的框架本来就预期的限流器;除了凭据的来源之外,这里没有任何 CapyDB 特有的东西。
import { Ratelimit } from '@upstash/ratelimit'
import { Redis } from '@upstash/redis'
const ratelimit = new Ratelimit({
redis: new Redis({
url: process.env.CAPYDB_KV_REST_URL!,
token: process.env.CAPYDB_KV_REST_TOKEN!,
}),
limiter: Ratelimit.slidingWindow(10, '10 s'),
})
export async function POST(request: Request) {
const { success } = await ratelimit.limit(userIdFrom(request))
if (!success) return new Response('Too many requests', { status: 429 })
// ...
}03
K/V 是一项独立的功能,不是拧在数据库上的附件。你可以添加一个存储,然后从不打开旁边的数据库:不用设计模式,不用配置连接串,不用执行迁移。很多应用只想要一个限流器,别的都不需要,而这就是使用 CapyDB 的一种完整方式。
存储仍然归属于某个项目,因为项目是 CapyDB 划分计费、访问权限和区域的单位。项目会保留一个数据库单元,你尽可以忽略它——闲置的单元会自动暂停,不消耗任何资源。
04
K/V 存储就是一个单元,与数据库获得的运行时原语完全相同。这不是对共享服务器中某个命名空间的比喻:
05
两种协议都是标准协议,因此迁移过来只需要改一个 URL 和一个令牌:
06
K/V 按各套餐的规格包含在每个套餐中——没有单独的 K/V 订阅,也不按命令计费。下面的数字就是存储实际能装下的容量:
07
K/V 存储会保留定期快照,因此能挺过一次重启,但它不是数据库。没有备份,没有时间点恢复,也没有副本;存储写满后,淘汰策略会丢弃键。
请把它当作快速且可丢弃的状态:计数器、会话、缓存、锁。任何丢失了会让你难受的数据,都应该放在旁边那个数据库单元里,那里确实有备份和时间点恢复。
08
在控制台中打开某个项目的 K/V 标签页并添加存储。它几秒钟内完成配置,并且只会向你出示一次端点和令牌——令牌仅以哈希形式保存,请当场复制。