fiber的cache中间件可提升qps 3~8倍,但需合理配置ttl与maxentries防oom;支持按路由分组、skipper动态跳过、http方法过滤控制缓存;自定义keygenerator注入用户标识避免数据混用;对接redis实现分布式缓存。

用Fiber框架的Cache中间件给接口加缓存,能直接跳过业务逻辑执行、复用上一次响应体,QPS可提升3~8倍;但若缓存键设计不当或未设TTL,会导致脏数据或内存溢出。
启用Cache中间件并配置基础参数
安装依赖后,在应用初始化时调用fiber.New()并传入cache.New()实例,这是启用缓存的前提。
运行go get github.com/gofiber/fiber/v2/middleware/cache → 在main.go中导入"github.com/gofiber/fiber/v2/middleware/cache" → 调用app.Use(cache.New())即可启用默认缓存(5分钟TTL,内存存储,最大1000条)。
【必须显式设置MaxEntries】默认不限制条目数,高并发下易触发OOM;生产环境务必设为合理值,例如cache.New(cache.Config{MaxEntries: 500})。
按URL路径精准控制缓存策略
方法一:对特定路由组启用缓存
使用api := app.Group("/api")创建分组 → 对该分组调用api.Use(cache.New(...)),这样只有/api下的接口被缓存,/admin等管理路径完全绕过。
方法二:用Skipper函数动态跳过缓存
在Config中传入Skipper: func(c *fiber.Ctx) bool { return c.Get("X-No-Cache") == "1" },前端请求带X-No-Cache: 1头即可强制击穿缓存。
方法三:按HTTP方法区分缓存行为
GET和HEAD默认可缓存,但POST/PUT/DELETE必须禁用——Cache中间件不自动识别方法语义,需手动过滤:Skipper: func(c *fiber.Ctx) bool { return c.Method() != "GET" && c.Method() != "HEAD" }。
自定义缓存键避免用户数据混用
第一步:默认键只含URI和查询参数,无法区分登录用户
例如/user/profile?tab=posts对所有用户返回同一缓存体,导致A用户看到B用户的资料。
第二步:注入用户标识到缓存键
在Config.KeyGenerator中重写生成逻辑:KeyGenerator: func(c *fiber.Ctx) string {<br> userID := c.Locals("user_id")<br> if id, ok := userID.(int); ok {<br> return fmt.Sprintf("%s:%d", c.Path(), id)<br> }<br> return c.Path()<br>}
第三步:确保user_id已存入Locals
必须在Cache中间件之前执行认证中间件,并调用c.Locals("user_id", uid),否则KeyGenerator里取不到值。
注意:KeyGenerator返回空字符串会触发panic,务必保证有fallback路径。
对接Redis实现分布式缓存
安装github.com/go-redis/redis/v9 → 初始化Redis客户端 → 将cache.Store替换为redis.NewStore实例。
示例代码:rdb := redis.NewClient(&redis.Options{Addr: "localhost:6379"})<br>store := redis.NewStore(rdb)<br>app.Use(cache.New(cache.Config{Store: store}))
这一步做完后,所有节点共享同一份缓存数据,新部署的实例无需预热即可命中历史响应。











