如何在同一个ehCache中缓存2个不同的bean方法?

10

假设我有两个不同的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)缓存的值。

最简单的方法是使用方法名来构建键。

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


密钥是如何生成的? - Roman C
@RomanC 默认情况下,键生成器使用所有输入参数。 - corvax
2个回答

11

Spring缓存抽象允许您使用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。这可以让您缓存不同参数的结果。


7
使用自定义的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")注释添加到可缓存的方法中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接