修改实际数据时,是否执行@Cacheable带注释的方法?

时间:2019-03-14 14:12:24

标签: java rest spring-mvc

我正在构建一个RESTful Web服务,可以由浏览器或其他Web服务使用。 我愿意通过缓存来减少带宽,但是我希望该方法得以执行,并且仅在与上次修改的缓存不同时才发送实际数据。

根据我对@cacheable批注的理解,该方法仅执行一次,并且将缓存输出直到缓存过期。

@CachePut也会每次执行并更新缓存,但是即使未更新,它也会再次发送缓存吗?

摘要是:我需要客户端能够发送其缓存的最后修改日期,并且仅在修改后才获取新数据。

Spring还如何处理客户端缓存和if-modified-since标头?我需要保存上次修改的时间还是自动处理?

2 个答案:

答案 0 :(得分:1)

不,您需要自己做。

您需要用@Cacheabledocs)注释“获取”方法,然后用@CacheEvictdocs)注释“更新”方法,以便“删除”您的缓存。因此,当您在修改后的下一次获取数据时,它将是新鲜的。

或者,您可以使用@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";
        }