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

缓存

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

请求指令
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,
}))

或者,您可以像这样自定义键和过期时间

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.Duration过期是缓存响应的有效期。1 * time.Minute
CacheHeaderstringCacheHeader 是响应头上的头,指示缓存状态,可能的返回值为“命中”、“未命中”或“无法访问”。X-Cache
CacheControlbool如果 CacheControl 设置为 true,则启用客户端缓存。false
KeyGeneratorfunc(*fiber.Ctx) stringKey 允许您生成自定义键。func(c *fiber.Ctx) string { return utils.CopyString(c.Path()) }
ExpirationGeneratorfunc(*fiber.Ctx, *cache.Config) time.DurationExpirationGenerator 允许您根据请求生成自定义过期键。nil
存储fiber.StorageStore 用于存储中间件的状态。内存存储
Store(已弃用)fiber.Storage已弃用:改用 Storage。内存存储
Key(已弃用)func(*fiber.Ctx) string已弃用:改用 KeyGenerator。nil
StoreResponseHeadersboolStoreResponseHeaders 允许您存储由下一个中间件和处理程序生成的附加头。false
MaxBytesuintMaxBytes 是同时存储在缓存中的响应正文的最大字节数。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},
}