我正在尝试按照https://www.java4s.com/spring-boot-tutorials/how-to-configure-cache-in-spring-boot-applications/上的说明在spring-boot应用程序上添加缓存,但是它不起作用。我不确定如何测试。我在本文类似的控制器下有一个system.out.print。如果缓存有效,则它将仅打印“测试”一次,但从具有相同输入的请求中返回相同结果。我的代码如下:
CurrencyController.java
@RequestMapping(method = RequestMethod.POST)
@Cacheable(value="currency")
public ResponseEntity getExchangedCurrency(final @RequestBody CurrencyExchange currencyExchange) {
System.out.println("Test");
return ResponseEntity.ok()
.headers(responseHeaders)
.body(currencyService.calculate(currencyExchange));
}
App.java
@SpringBootApplication
@EnableCaching
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
答案 0 :(得分:1)
@Cacheable
批注的工作方式是默认使用方法参数作为缓存映射的键。在这种情况下,currencyExchange
对象。由于它是每个请求的对象,因此Spring Request分派器会创建新对象,并且缓存管理器将保持为单独的键。
Req1-> object1-> map.put(object1,response)
Req2-> object2-> map.contains(object2)-> false-> map.put(object2, 响应)
如果您认为并非所有的发帖请求都从缓存发送相同的响应(并非总是如此),则可以这样更改键。
@RequestMapping(method = RequestMethod.POST)
@Cacheable(value="currency", key="#root.method")
public ResponseEntity getExchangedCurrency(final @RequestBody CurrencyExchange currencyExchange) {
System.out.println("Test");
return ResponseEntity.ok()
.headers(responseHeaders)
.body(currencyService.calculate(currencyExchange));
}
如果您的currencyExchange具有方法getId()
可用作潜在的缓存键,您也可以使用Spring Expression Language(SpEL)表达式定义键,
@Cacheable(value="currency", key="#root.args[0].getId()")
要清除缓存,请在春季启动主类上添加@EnableCaching
,以毫秒为单位的fixedDelay
@CacheEvict(allEntries = true, value = {"currency"})
@Scheduled(fixedDelay = 5000 , initialDelay = 5000)
public void clearCache() {
System.out.println("Cache cleared");
}