·更新于 2026年10月25日· 23 次浏览 Nuxt 3RedisVue3Node.jsMongoDB个人站建设

Nuxt 3 个人站缓存实践:用 Redis 做页面与接口的按需失效

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

Nuxt 3 个人站缓存实践:用 Redis 做页面与接口的按需失效 封面
ZHOUYI

作者

ZHOUYI

个人博客更新文章后,最尴尬的是首页、详情页、接口各缓存一份,手动清很容易漏。我后来把缓存分成“页面结果”和“接口数据”,再用 Redis 标签管理失效,更新文章只删相关键,不整站清空。

先给缓存划边界

页面缓存适合内容页、归档页这类读多写少的路由。接口缓存适合文章详情、标签列表、评论计数等聚合查询。我的原则是:页面缓存负责减少渲染,接口缓存负责减少 MongoDB 查询。两者都写入 Redis,并设置兜底 TTL,避免永久脏数据。

用标签代替全量清理

关键不是“存”,而是“删”。我会给每个缓存键打标签。比如文章详情页绑定 post:{id},文章列表页绑定 post:list,标签页绑定 tag:{slug}。发布或修改文章时,只需找出这些标签对应的键并删除。这样不会误伤评论、友链、站点配置等无关缓存。

  • 文章详情:post:{id},标签包含 post:{id}
  • 列表页:/、/posts,标签包含 post:list
  • 标签页:/tags/{slug},标签包含 tag:{slug}
js
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,再用标签把“内容变更”和“缓存键”关联起来。等文章量上来后,这套按需失效会比手动清缓存稳很多。

Guestbook

留言

若这篇文章也曾停在你心上,留一行字吧,我会看的。

先确认一下邮箱

多这一步,是为了少些机器骚扰,也让我能更踏实地读每一条真人写下的字。验证码 10 分钟内有效;同一邮箱 60 秒内只能发一封。

本文留言

共 0 条已加载 0 条

这里还静悄悄的——愿意做第一个留下脚印的人吗?