首页 > 解决方案 > 为什么导致@Cacheable 内部的条件没有任何影响?

问题描述

我有以下方法:

@Cacheable(value = "pow_cache", unless = "#pow==3",condition = "#val<5&&#result<100")
public Double pow(int val, int pow) throws InterruptedException {
    System.out.println(String.format("REAL invocation myService.pow(%s, %s)", val, pow));
    Thread.sleep(3000);
    return Math.pow(val, pow);
}

以及以下主要内容:

@SpringBootApplication
@EnableCaching
public class Main {

    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext context = SpringApplication.run(Main.class);
        MyService myService = context.getBean(MyService.class);
        invokePow(myService, 4, 4);

    }

    private static void invokePow(MyService myService, int val, int pow) throws InterruptedException {
        for (int i = 0; i < 2; i++) {
            System.out.println(String.format("invoke myService.pow(%s, %s)", val, pow));
            System.out.println(myService.pow(val, pow));
        }
    }
}

我看到以下输出:

invoke myService.pow(4, 4)
REAL invocation myService.pow(4, 4)
256.0
invoke myService.pow(4, 4)
256.0

所以这意味着结果被缓存了,但这是出乎意料的,因为

condition = "#val<5&&#result<100"

结果是 256 并且256<100是错误的

我错了什么?

标签: javaspringspring-bootspring-cachejcache

解决方案


condition和之间有区别unless。基于此

public abstract String 除非
Spring 表达式语言 (SpEL) 属性用于否决方法缓存。
与 condition() 不同,此表达式在方法被调用后进行评估,因此可以引用结果。默认为“”,这意味着缓存永远不会被否决。

spring doc 3.2.x开始 ,您#result只能在unless.

你可以试试

@Cacheable(value = "pow_cache", unless = "#pow==3||#result>100",condition = "#val<5")

推荐阅读