如何在同一个 ehCache 中缓存 2 个不同的 bean 方法?
How to cache 2 different bean methods in same ehCache?
假设我有 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) 可以 return 由 getMeth1(1) 缓存的值。
使用方法名称构建密钥的最简单方法是什么?
P.S。请不要提及为不同的方法使用相同的缓存可能是错误的事实,只是帮助解决这个问题。
使用自定义 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")
注释
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。这允许您缓存不同参数的结果
假设我有 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) 可以 return 由 getMeth1(1) 缓存的值。
使用方法名称构建密钥的最简单方法是什么?
P.S。请不要提及为不同的方法使用相同的缓存可能是错误的事实,只是帮助解决这个问题。
使用自定义 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")
注释
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。这允许您缓存不同参数的结果