在春季启动中如何在控制器/服务上使用缓存?

我正在尝试按照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);



    }
}

shuojie 回答:在春季启动中如何在控制器/服务上使用缓存?

@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");
}
本文链接:https://www.f2er.com/3070118.html

大家都在问