#java #angular #spring-boot
#java #angular #spring-boot
Вопрос:
Я разрабатываю веб-приложение, используя springboot для серверной части, обслуживающей rest API, и Angular7 для интерфейса.
загрузка моего приложения занимает так много времени, потому что ему приходится выполнять большую обработку на сервере, поэтому я решил повысить производительность, сохранив кэшированные данные, чтобы сначала загрузить страницу и, в конечном итоге, обновить данные по окончании обработки.
Это работает, но у меня проблема: когда я обновляю данные в Angular, они обычно сохраняются в моей базе данных, но если я обновляю страницу, я не вижу изменений, потому что браузер продолжает обращаться к старым кэшированным данным, а не изменять новые.
Есть ли способ сделать недействительными определенные данные в кэше браузера при их изменении?
Springboot:
Моя конечная точка контроллера rest похожа на эту:
@GetMapping(value = "/users")
public Iterable<User> getAllUsers(HttpServletResponse response) {
response.setHeader("Cache-Control", "max-age=3600");
return this.userService.findAll());
}
Мой сервис:
@Cacheable("users")
public Iterable<User> findAll() {
return this.userRepository.findAll();
}
Мой угловой сервис:
getUsers(): Observable<User[]> {
return this.http.get<User[]>(`<ip>' '/users');
}
Комментарии:
1. вы можете попытаться уменьшить
max-age
время с 3600 секунд до разумного значения
Ответ №1:
Я вижу, что вы кэшируете на стороне сервера, вы можете удалить кеш, вызвав метод с аннотацией @CacheEvict
с ключом, который вы хотите удалить:
@CacheEvict(value = "users", allEntries = true)
Или вы можете сделать это программно с помощью CacheManager
:
@Autowired
CacheManager cacheManager;
public void evictSingleCacheValue(String cacheName, String cacheKey) {
cacheManager.getCache(cacheName).evict(cacheKey);
}
Комментарии:
1. Спасибо, это мне очень помогло, но у меня все еще есть проблема: я также использую кеш браузера, добавляя элемент управления кешем в ответ внутри контроллера, как я могу аннулировать это тоже?
2. @PatrickMazzucchetti вы пробовали устанавливать значение ключа на
null
?3. где я должен установить значение null?
Ответ №2:
Вы можете проверить, есть ли какие-либо изменения в элементах управления на основе времени или содержимого на стороне вашего сервера, с помощью облегченных запросов.
На основе времени => вы можете использовать Last = Modified в заголовке
На основе содержимого => вы можете использовать Etag
пожалуйста, проверьте эти две ссылки;https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers
https://www.logicbig.com/quick-info/web/last-modified-and-if-modified-since.html