缓存提供静态内容的路由有时很重要,这样可以使你的Web应用更快地执行,而不用花费时间为客户端重建响应。
有两种方法可以实现HTTP缓存。一种是将每个处理程序的内容存储在服务器端,另一种是通过检查一些标头并发送`304未修改的`,以便让浏览器或任何兼容的客户端自行处理缓存。
Iris 通过它的 [iris/cache](https://github.com/kataras/iris/tree/master/cache)子包提供服务器和客户端缓存,该子包导出 ` iris.Cache` and `iris.Cache304`中间件。
让我们看看他们的样子。
## 缓存
缓存是一种中间件,它为下一个处理程序提供服务器端缓存功能,可以想这样使用: `app.Get("/", iris.Cache, aboutHandler)`。
`Cache` 接受一个参数:缓存过期时间。 如果这是一个无效的参数, <=2 秒, 这个参数讲被 "cache-control's maxage" 头控制。
可以缓存所有类型的响应,模板,json,文本等。
将其用于服务器端缓存,请参见 `Cache304`,以获取更适合你需要的替代方法。
```
func Cache(expiration time.Duration) Handler
```
有关更多选项和自定义,请使用 [kataras/iris/cache.Cache](https://godoc.org/github.com/kataras/iris/cache#Cache) ,它返回一个 [可以在其中添加或删除 "规则"](https://godoc.org/github.com/kataras/iris/cache/client#Handler)。
## NoCache
`NoCache` 是一种中间件,它覆盖 Cache-Control, Pragma and Expires 头,以便在浏览器的后退和前进功能期间禁用缓存。
在 HTM L路由上可以很好地使用此中间件。即使在浏览器的“后退”和“前进”箭头按钮上也刷新页面。
```
func NoCache(Context)
```
请参阅 `StaticCache` 以了解相反的行为。
## StaticCache
`StaticCache` ,返回用于缓存静态文件的中间件,通过将 "Cache-Control" 和 "Expires" 头发送给客户端。它接受一个输入参数 "cacheDur",一个 time.Duration ,用于计算到期时间。
如果 "cacheDur" <=0 ,则它将返回 `NoCache` 中间件,以禁用浏览器的“后退”和“前进”动作之间的缓存。
使用方法: `app.Use(iris.StaticCache(24 * time.Hour))` 或者`app.Use(iris.StaticCache(-1))`。
```
func StaticCache(cacheDur time.Duration)Handler
```
中间件是一个简单的处理程序,也可以在另一个处理程序内调用,例如:
```
cacheMiddleware := iris.StaticCache(...)
func(ctx iris.Context){
cacheMiddleware(ctx)
[...]
}
```
## Cache304
`Cache304` 返回一个中间件,每当 "If-Modified-Since" 请求头 (time) 是在 time.Now() + expiresEvery (始终与其 UTC 值进行比较)之前,发送一个 `StatusNotModified` (304) 。
与HTTP RCF兼容的客户端(所有浏览器均为,postman 等工具)将正确处理缓存。
使用该缓存而不是服务器端缓存的唯一缺点是此方法将发送304状态代码而不是200,因此,如果将它与其他微服务一起使用,则还必须检查该状态代码,以便有效的回应。
开发人员可以自由地扩展此方法的行为,方法是手动查看系统目录的更改,并根据文件修改日期将 `ctx.WriteWithExpiration` 与 "modtime" 一起使用,类似于 `HandleDir`(会发送OK(200)状态和浏览器磁盘缓存而不是304).
```
func Cache304(expiresEvery time.Duration) Handler
```
可以在以下网址找到示例:https://github.com/kataras/iris/tree/master/_examples/cache.
