本文翻译:吴嘉俊,叩丁狼高级讲师
缓存是HTTP协议中一个非常重要的特征。但是由于某些原因,在HTTP协议中,缓存常常只用来做图片,CSS样式表或者JS等静态文件缓存。其实,HTTP缓存不仅仅可以用来做静态资源的缓存,同样对动态的请求也同样有用。
仅仅只需要一些简单的工作,你就可以提高应用的响应速度,提高用户体验。在这篇文章中,你将会学到如何在Spring中使用内置的HTTP响应缓存机制来缓存controller的结果。
如何使用HTTP响应缓存?
你可以在应用中的各个层次做缓存。比如数据库可以用内存缓存存储,在应用层可以缓存业务数据,在web层当然也可以缓存和重用数据。
客户端和服务器依赖HTTP协议进行交流。缓存机制允许我们通过减少在客户端和服务器之间传输的数据量来优化网络传输压力。
那么我们能做哪些优化呢?
当一个资源不会频繁更新,并且我们非常准确的知道数据什么时候更新的时候,HTTP缓存就是一个不错的优化性能的方案。
一旦确定使用HTTP缓存策略,你就必须要选择一种合适的验证缓存的机制。HTTP协议提供了多种请求头和响应头参数,可以用来控制缓存。
选择使用哪种HTTP头取决于你想怎么优化缓存。但是,不管你怎么使用,我们都可以根据缓存使用在什么地方,来划分缓存的管理选项,可以在客户端验证,也可以再服务器端验证。
我们来看看具体的使用。
客户端缓存验证
当你知道一个请求的资源在一个指定的时间内不会发生改变,服务器端可以将这个时间信息通过响应头发送给客户端。根据这个缓存时效信息,客户端可以选择是否重新冲服务端请求信息,或者重用之前已经下载的信息。
有两个可选的头参数可以控制什么时候客户端需要重新从服务器端获取数据,什么时候删除缓存。我们在实战中来看看。
如果你想阻止客户端在一个指定时间内不要去请求服务器,你可以使用Cache-Control头信息,通过设置获取到的数据可以在多长时间之内重复使用。
或者你可以通过设置max-age=[seconds]信息来告诉客户端,在多少秒之内,资源可以缓存使用。缓存的有效性与请求的时间有关。
为了在Spring的控制器中控制HTTP头信息,我们需要返回ResponseEntity包装类型。下面是一个例子:
@GetMapping("/{id}")
ResponseEntity<Product> getProduct(@PathVariable long id) {
// …
CacheControl cacheControl = CacheControl.maxAge(30, TimeUnit.MINUTES);
return ResponseEntity.ok()
.cacheControl(cacheControl)