fiber 无需第三方缓存中间件即可通过 cache-control 响应头实现单路由缓存,如 c.set("cache-control", "public, max-age=30"),需在 c.send* 前调用,支持动态策略。

Fiber 本身不提供内置的单路由缓存中间件,但你可以用标准 HTTP 缓存头 + 简单逻辑,在特定路由上实现「客户端/代理层」缓存,无需引入 Redis 或内存缓存库。
为什么不用第三方缓存中间件做单路由缓存
多数 Fiber 缓存中间件(如 fiber/middleware/cache)面向全站或路径前缀,对单个路由(比如 /posts/latest)做精细控制时反而难配置、易污染其他路由。更关键的是:它默认缓存整个响应体到内存,而你可能只需要告诉浏览器“这个接口 60 秒内别重发请求”——这完全靠 Cache-Control 就能解决。
- 中间件缓存会增加内存占用和 GC 压力,尤其在高并发返回大 JSON 时
- 它无法区分不同 query 参数(如
/api/data?lang=zh和?lang=en),容易缓存错版本 - 若你只希望 CDN 或浏览器缓存,中间件缓存是冗余的,还可能绕过 CDN 的缓存策略
直接设置 Cache-Control 头是最简方案
对明确知道不变或低频更新的路由(如健康检查、静态配置、公开文章列表),在 handler 开头加一行即可:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
<pre class="brush:php;toolbar:false;">app.Get("/health", func(c *fiber.Ctx) error {
c.Set("Cache-Control", "public, max-age=30")
return c.JSON(fiber.Map{"status": "UP"})
})
public 允许 CDN、代理、浏览器共同缓存;<code>private只允许终端浏览器缓存-
max-age=30表示 30 秒内不再发起新请求;设为0或no-cache仍会发请求,但带If-None-Match校验 - 别漏掉
c.Set()调用位置——必须在任何c.Send*之前,否则 header 已发送,设置无效
需要动态缓存策略?用 c.Locals() + 自定义逻辑
当缓存时间依赖请求参数或后端状态(如用户角色、内容更新时间),别硬编码 max-age,改用运行时计算:
<pre class="brush:php;toolbar:false;">app.Get("/article/:id", func(c *fiber.Ctx) error {
id := c.Params("id")
// 假设你查了 DB 拿到 updated_at 时间戳
updatedAt := time.Now().Add(-2 * time.Hour) // 实际应从 DB 读
age := int(time.Since(updatedAt).Seconds())
if age
- 注意
min(age, 3600) 是防 age 过大(比如文章一年没更新),避免缓存失控 - 不要在 handler 里调
c.Locals()存缓存数据——fiber.Ctx是复用对象,下个请求会覆盖值 - 如果真要服务端缓存响应体,建议用
sync.Map或go-cache独立管理,键名拼成"article:" + id,而非绑定到 ctx
容易被忽略的 ETag 和 Last-Modified 配合点
仅靠 max-age 是“强缓存”,用户强制刷新(Ctrl+F5)仍会跳过。加上 ETag 或 Last-Modified 才支持“协商缓存”,节省带宽:
- 对 JSON 接口,用
c.ETag()自动生成基于响应体哈希的标识:c.ETag("v1-" + id)更可控(需自己拼版本) - 对文件类接口(如
/avatar/:uid),优先用Last-Modified:c.Set("Last-Modified", fileModTime.UTC().Format(http.TimeFormat)) - 一旦设置了
ETag或Last-Modified,Fiber 会自动处理If-None-Match/If-Modified-Since,返回304 Not Modified,但前提是 handler 最终返回nil(不是c.SendStatus(304))
真正生效的关键不在“有没有设 header”,而在「客户端是否尊重它」——浏览器和主流 CDN 都支持,但某些测试工具(如旧版 curl)默认不发 If-None-Match,别因此误判逻辑失效。










