【问题标题】:How to cache 2 different bean methods in same ehCache?如何在同一个ehCache中缓存2个不同的bean方法?
【发布时间】:2016-08-12 23:19:27
【问题描述】:

假设我有 2 个不同的 bean 方法,我想通过 EhCache 进行缓存:

@Component
public class StatService {

@Cacheable(value = "statCalc")
public int getMeth1(int param) {
    // LOGIC1
}

@Cacheable(value = "statCalc")
public int getMeth2(int param) {
    // LOGIC2
}
}

我想将它们驻留在同一个缓存中 - ehcache.xml:

<cache name="statCalc"
       ...
/>

问题是缓存键是由输入参数而不是方法签名生成的,因此getMeth2(1)可以返回getMeth1(1)缓存的值。

使用方法名称构建密钥的最简单方法是什么?

附:请不要提及对不同方法使用相同的缓存可能是错误的事实,只是帮助解决这个问题。

【问题讨论】:

  • 密钥是如何生成的?
  • @RomanC 默认使用所有输入参数的密钥生成器。

标签: java spring caching ehcache spring-cache


【解决方案1】:

使用自定义KeyGenerator,例如

public class CustomKeyGenerator implements KeyGenerator{
    @Override
    public Object generate(Object target, Method method, Object... params) {
        StringBuilder key = new StringBuilder();
        //include method name in key
        key.append(method.getName());
        if (params.length > 0) {
            key.append(';');
            for (Object argument : params) {
                key.append(argument);
                key.append(';');
            }
        }
        return key.toString();
    }
}

将密钥生成器注册为 bean 并将 @CacheKeyStrategy("keyGeneratorBeanName") 注解添加到可缓存方法中

【讨论】:

    【解决方案2】:

    Spring Cache 抽象允许您使用 SpeL 来指定缓存键。例如,您可以使用方法名称、参数值等。

    例如

    @Component
    public class StatService {
    
       @Cacheable(value="statCalc",key="#root.method.name.concat(':').concat(#param)")
       public int getMeth1(int param) {
          // LOGIC1
       }
    
       @Cacheable(value="statCalc",key="#root.method.name.concat(':').concat(#param)")
       public int getMeth2(int param) {
       // LOGIC2
       }
    }
    

    对于方法调用 getMeth1(5),键是 getMethod1:5 对于方法调用 getMethod1(0),键是 getMethod1:0

    对于方法调用 getMeth2(3),键是 getMethod2:3。这允许您缓存不同参数的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多