Spring MVC 当实际数据被修改时,@Cacheable注解的方法是否会执行?

scyqe7ek  于 2023-10-24  发布在  Spring
关注(0)|答案(2)|浏览(160)

我正在构建一个可以被浏览器或其他Web服务使用的REST风格的Web服务。我愿意通过缓存来减少带宽,但是我希望只有当它与上次修改的缓存不同时,才能执行该方法并发送实际数据。
从我对@Cacheable注解的理解来看,该方法只执行一次,输出将被缓存,直到该高速缓存过期。
@CachePut每次都会执行并更新该高速缓存,但即使没有更新,它也会再次发送该高速缓存吗?
总结是:我需要客户端能够发送它的缓存的最后修改日期,只有得到一个新的数据,如果它已被修改。
Spring如何处理客户端缓存和if-modified-since头?我需要保存上次修改时间还是自动处理?

9rygscc1

9rygscc11#

不,你得自己做。
你需要用@Cacheabledocs)注解你的“fetch”方法,然后用@CacheEvictdocs)注解“update”方法,以便“删除”你的缓存。所以当你下次在修改后提取数据时,它将是新鲜的。
或者,您可以使用@CacheEvict创建另一个方法,并从“update”方法手动调用它。

rdlzhqv9

rdlzhqv92#

该高速缓存相关的annotations(@Cacheable@CacheEvict etc)将只处理应用程序维护的该高速缓存。任何http响应header,如last-modified etc,都必须单独管理。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";
        }

相关问题