缓存
内存缓存工具,避免重复请求数据库或外部 API
内存缓存在开发环境重启时会清零。如果需要跨进程共享缓存(比如多实例部署),建议配合 Redis 使用。大多数场景下内存缓存已经够用。
这是什么
@01mvp/cache 是项目的内存缓存工具。缓存(Cache)就是把常用的数据临时存在内存里,下次要用的时候直接拿,不用再去数据库或 API 查一遍。
打个比方:你每次问数据库"用户 123 是谁",数据库都得翻一遍记录。如果一分钟内问了一百次,数据库就得翻一百遍。有了缓存,第一次查完就记在内存里,后面 99 次直接拿结果,快很多。
能做什么
- 设置和获取缓存:存数据时设一个过期时间(TTL = Time To Live,存活时间),过期自动删除
- 主动刷新缓存:数据更新后可以手动让缓存失效,Next.js 里可以按标签(Tag)或路径(Path)批量刷新
- 自动清理过期数据:创建缓存时可以设置自动清理间隔,防止内存占用无限增长
- 监控缓存效果:记录命中/未命中次数,算命中率,优化缓存策略
怎么用
import { createCache, revalidateCache } from "@01mvp/cache";
// 创建一个缓存实例(自动每 60 秒清理过期数据)
const userCache = createCache({ cleanupInterval: 60 });
// 存数据:缓存 5 分钟
await userCache.set("user:123", userData, { ttl: 300 });
// 取数据:命中返回数据,未命中返回 null
const cached = await userCache.get("user:123");
// 常见模式:先看缓存,没有再查库
async function getUser(id: string) {
const cached = await userCache.get(`user:${id}`);
if (cached) return cached;
const user = await db.user.findUnique({ where: { id } });
if (user) {
await userCache.set(`user:${id}`, user, { ttl: 300 });
}
return user;
}
// 在 Server Action 中批量刷新页面缓存
revalidateCache({ tags: ["user"], paths: ["/dashboard"] });大概原理
请求数据
→ 查缓存:有没有?过期没?
→ 有且没过期 → 直接返回(命中 hit)
→ 没有或过期了 → 去数据库 / API 查(未命中 miss)
→ 查到了 → 存缓存 + 返回
→ 没查到 → 返回空(可缓存空值防止缓存穿透)缓存穿透:当大量请求同时查一个不存在的数据,每次都打到数据库上。解决办法是连"空结果"也缓存起来,短期内不重复查。
选多大 TTL
| 数据类型 | 推荐 TTL | 说明 |
|---|---|---|
| 实时数据(在线人数等) | 30-60 秒 | 变化快,短缓存 |
| 用户资料 | 5-15 分钟 | 不常改 |
| 文章内容 | 30-60 分钟 | 基本不变 |
| 系统配置 | 1-24 小时 | 几乎不变 |