Nuxt 3 个人站缓存实践:用 Redis 做页面与接口的按需失效
以个人博客为例,聊聊如何把 Nuxt 3 的页面缓存和接口缓存拆开,再用 Redis 标签机制在文章更新时精准失效,避免整站清缓存。

作者
ZHOUYI
个人博客更新文章后,最尴尬的是首页、详情页、接口各缓存一份,手动清很容易漏。我后来把缓存分成“页面结果”和“接口数据”,再用 Redis 标签管理失效,更新文章只删相关键,不整站清空。
先给缓存划边界
页面缓存适合内容页、归档页这类读多写少的路由。接口缓存适合文章详情、标签列表、评论计数等聚合查询。我的原则是:页面缓存负责减少渲染,接口缓存负责减少 MongoDB 查询。两者都写入 Redis,并设置兜底 TTL,避免永久脏数据。
用标签代替全量清理
关键不是“存”,而是“删”。我会给每个缓存键打标签。比如文章详情页绑定 post:{id},文章列表页绑定 post:list,标签页绑定 tag:{slug}。发布或修改文章时,只需找出这些标签对应的键并删除。这样不会误伤评论、友链、站点配置等无关缓存。
- 文章详情:post:{id},标签包含 post:{id}
- 列表页:/、/posts,标签包含 post:list
- 标签页:/tags/{slug},标签包含 tag:{slug}
const key = `page:${path}`;
await redis.set(key, html, 'EX', 600);
await redis.sadd(`tag:post:${id}`, key);
// 更新文章后
const keys = await redis.smembers(`tag:post:${id}`);
if (keys.length) await redis.del(keys);
await redis.del(`tag:post:${id}`);踩坑与边界
实际做时有几个坑。第一,别把登录态、草稿预览也缓存,键里要区分公开态。第二,标签集合本身也会膨胀,删完缓存后顺手删标签。第三,Redis 只负责快速失效,MongoDB 仍是数据源,接口层仍要做参数校验与错误降级。第四,Nuxt 页面如果使用了客户端异步数据,要确认缓存的是最终 HTML 还是接口 JSON,避免“页面新了,接口旧了”。
“缓存不是越久越好,个人站最重要的是“更新后能立刻看见”。”
小结
对个人博客来说,Redis 缓存不必一开始就做得很复杂。先给高频页面和接口加短 TTL,再用标签把“内容变更”和“缓存键”关联起来。等文章量上来后,这套按需失效会比手动清缓存稳很多。