跳到主要内容
版本: v2.x

缓存

Fiber 的缓存中间件,用于拦截响应并将其缓存。此中间件使用 c.Path() 作为唯一标识符来缓存 BodyContent-TypeStatusCode。特别感谢 @codemicro 为 Fiber core 创建此中间件!

请求指令
Cache-Control: no-cache 将返回最新响应,但仍会对其进行缓存。你总是会得到一个 miss 缓存状态。
Cache-Control: no-store 将阻止缓存。你总是会得到最新响应。

签名

func New(config ...Config) fiber.Handler

示例

导入 Fiber web 框架的中间件包

import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cache"
)

初始化 Fiber 应用后,可以使用以下方式

// Initialize default config
app.Use(cache.New())

// Or extend your config for customization
app.Use(cache.New(cache.Config{
Next: func(c *fiber.Ctx) bool {
return c.Query("noCache") == "true"
},
Expiration: 30 * time.Minute,
CacheControl: true,
}))

或者你可以像这样自定义 key 和过期时间

app.Use(cache.New(cache.Config{
ExpirationGenerator: func(c *fiber.Ctx, cfg *cache.Config) time.Duration {
newCacheTime, _ := strconv.Atoi(c.GetRespHeader("Cache-Time", "600"))
return time.Second * time.Duration(newCacheTime)
},
KeyGenerator: func(c *fiber.Ctx) string {
return utils.CopyString(c.Path())
},
}))

app.Get("/", func(c *fiber.Ctx) error {
c.Response().Header.Add("Cache-Time", "6000")
return c.SendString("hi")
})

配置

属性类型描述默认值
下一个func(*fiber.Ctx) boolNext 定义了一个在创建缓存条目之前执行的函数,可用于在不创建缓存的情况下执行请求。如果条目已存在,则会使用现有条目。如果你想在某些情况下完全绕过缓存功能,应使用 skip 中间件nil
过期时间time.DurationExpiration 是缓存响应的生存时间。1 * time.Minute
缓存头stringCacheHeader 是响应头中指示缓存状态的头部,可能返回的值包括 “hit”、“miss” 或 “unreachable”。X-Cache
缓存控制boolCacheControl 设置为 true 时启用客户端缓存。false
KeyGeneratorfunc(*fiber.Ctx) stringKey 允许你生成自定义 key。func(c *fiber.Ctx) string { return utils.CopyString(c.Path()) }
ExpirationGeneratorfunc(*fiber.Ctx, *cache.Config) time.DurationExpirationGenerator 允许你根据请求生成自定义的过期时间 key。nil
存储fiber.StorageStore 用于存储中间件的状态。内存存储
Store (已弃用)fiber.Storage已弃用: 请改用 Storage。内存存储
Key (已弃用)func(*fiber.Ctx) string已弃用: 请改用 KeyGenerator。nil
存储响应头boolStoreResponseHeaders 允许你存储由后续中间件和处理程序生成的附加头部。false
最大字节数uintMaxBytes 是同时存储在缓存中的响应体的最大字节数。0 (无限制)
方法[]stringMethods 指定要缓存的 HTTP 方法。[]string{fiber.MethodGet, fiber.MethodHead}

默认配置

var ConfigDefault = Config{
Next: nil,
Expiration: 1 * time.Minute,
CacheHeader: "X-Cache",
CacheControl: false,
KeyGenerator: func(c *fiber.Ctx) string {
return utils.CopyString(c.Path())
},
ExpirationGenerator: nil,
StoreResponseHeaders: false,
Storage: nil,
MaxBytes: 0,
Methods: []string{fiber.MethodGet, fiber.MethodHead},
}