我在Springboot中开发了一个REST端点,该端点带有一个String
ID,并以一个ModelAndView
进行响应。该端点标记有@Cacheable
注释。现在,在给定的端点上可能会发生两件事。
情况1:请求ID存在于数据库中,并产生一个需要重定向到的URL。在这种情况下,应该缓存响应,以便在连续请求相同ID的情况下,可以从缓存中获取结果
情况2:请求的ID在数据库中不存在,因此重定向应该发生在特定的URL上,并且在这种情况下不应该进行缓存。
所以下面是我的方法
@GetMapping("{id}")
@Cacheable(value = "url-single",key = "#id",unless = "#result.view!=\"redirect:/notfound\"")
public ModelAndView redirect(@PathVariable("id") String id,ServletRequest servletRequest,ServletResponse servletResponse) {
HttpServletRequest request = HttpServletRequest.class.cast(servletRequest);
LOG.info("Redirection request from: {} for Short URL Key: {}",request.getRemoteAddr(),id);
try {
Optional<String> originalUrlOptional = urlManagerService.retrieveOriginalUrl(id);
if (originalUrlOptional.isPresent() && !StringUtils.isEmpty(originalUrlOptional.get())) {
LOG.info("Found Original URL: {} for Short URL Key: {}",originalUrlOptional.get(),id);
return new ModelAndView("redirect:https://" + originalUrlOptional.get());
}
} catch (NoSuchElementException e) {
LOG.error("Error while redirecting: {}",e.getMessage(),e);
}
return new ModelAndView("redirect:/notfound");
}
如果我从here正确地理解了它,则unless
中的关键字@Cacheable
适用于返回类型,并且可以访问返回类型对象,我们必须将其称为#result.attributeName <comparison> <value>
。
那么为什么我的Redis缓存中没有存储任何内容?如果删除unless
条件,则所有内容都会存储。条件不正确吗?