我正在构建一个RESTful Web服务,可以由浏览器或其他Web服务使用。 我愿意通过缓存来减少带宽,但是我希望该方法得以执行,并且仅在与上次修改的缓存不同时才发送实际数据。
根据我对@cacheable批注的理解,该方法仅执行一次,并且将缓存输出直到缓存过期。
@CachePut也会每次执行并更新缓存,但是即使未更新,它也会再次发送缓存吗?
摘要是:我需要客户端能够发送其缓存的最后修改日期,并且仅在修改后才获取新数据。
Spring还如何处理客户端缓存和if-modified-since标头?我需要保存上次修改的时间还是自动处理?
答案 0 :(得分:1)
不,您需要自己做。
您需要用@Cacheable
(docs)注释“获取”方法,然后用@CacheEvict
(docs)注释“更新”方法,以便“删除”您的缓存。因此,当您在修改后的下一次获取数据时,它将是新鲜的。
或者,您可以使用@CacheEvict
创建另一个方法,然后从“更新”方法中手动调用它。
答案 1 :(得分:0)
与缓存相关的注释(@Cacheable
,@CacheEvict
等)将仅处理由应用程序维护的缓存。任何http响应标头,例如last-modified等,都必须单独管理。 Spring MVC提供了一种方便的方式来处理它(docs)。
计算上次修改时间的逻辑显然必须针对特定应用。
其用法的一个例子是
MyController {
@Autowire
CacheService cacheService;
@RequestMapping(value = "/testCache", method = RequestMethod.GET)
public String myControllerMethod(WebRequest webRequest, Model model, HttpServletResponse response) {
long lastModified = // calculate as per your logic and add headers to response
if (request.checkNotModified(lastModified)) {
// stop processing
return null;
} else {
return cacheService.getData(model);
}
}
@Component
public class CacheService{
@Cacheable(value = "users", key = "#id")
public String getData(Model model) {
//populate Model
return "dataview";
}