Выполняются ли аннотированные методы @Cacheable при изменении фактических данных? - PullRequest
1 голос
/ 14 марта 2019

Я создаю веб-сервис RESTful, который может использоваться браузером или другим веб-сервисом. Я хочу уменьшить пропускную способность за счет кэширования, однако я хочу, чтобы метод выполнялся и отправлял фактические данные только в том случае, если он отличается от последнего измененного кэша.

Исходя из моего понимания аннотации @cacheable, метод выполняется только один раз, а выходные данные кэшируются до истечения срока действия кэша.

Также @CachePut выполняется каждый раз и обновляет кэш, но отправляет ли он кэш снова, даже если он не обновлен?

Сводка такова: мне нужно, чтобы клиент мог отправлять дату последнего изменения своего кэша и получать новые данные, только если он был изменен.

Кроме того, как Spring обрабатывает кэширование на стороне клиента и заголовки if-updated-Since? мне нужно сохранить время последнего изменения или оно обрабатывается автоматически?

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Нет, вам нужно сделать это самостоятельно.

Вам нужно аннотировать ваш метод «fetch» ​​с помощью @Cacheable ( docs ), а затем аннотировать метод «update» с помощью@CacheEvict ( docs ), чтобы "сбросить" ваш кеш.Поэтому, когда вы будете получать данные в следующий раз после их изменения, они будут свежими.

В качестве альтернативы, вы можете создать другой метод с помощью @CacheEvict и вручную вызывать его из метода "update".

0 голосов
/ 14 марта 2019

Аннотации, связанные с кешем (@Cacheable, @CacheEvict и т. Д.) Будут иметь дело только с кешем, поддерживаемым приложением.Любой заголовок HTTP-ответа, такой как последнее изменение и т. Д., Должен обрабатываться отдельно.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";
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...