Java @使用多个键进行缓存
我有一个接收DTO并返回一些结果的服务:Java @使用多个键进行缓存,java,spring,caching,methods,Java,Spring,Caching,Methods,我有一个接收DTO并返回一些结果的服务: @Override public int foo(Bar bar) { .... } 条形图如下(简化): 我想在foo方法上使用@Cacheable;但是,我想对id和name属性进行散列,而不是baz。有没有办法做到这一点?是的,您可以沿着以下几行指定使用Spring EL表达式: @Override @Cacheable(key="#bar.name.concat('-').concat(#bar.id)") public int foo
@Override
public int foo(Bar bar) {
....
}
条形图如下(简化):
我想在foo方法上使用@Cacheable;但是,我想对id和name属性进行散列,而不是baz。有没有办法做到这一点?是的,您可以沿着以下几行指定使用Spring EL表达式:
@Override
@Cacheable(key="#bar.name.concat('-').concat(#bar.id)")
public int foo(Bar bar) {
....
}
或者在bar上定义一个修改过的哈希代码并调用:
@Override
@Cacheable(key="#bar.hashCodeWithIdName")
public int foo(Bar bar) {
....
}
您也可以使用这种方法
@Override
@Cacheable(key="{#bar.name, #bar.id}")
public int foo(Bar bar) {
....
}
建议不要将hashcode用作键
由@Biju和@vsingh给出的答案都是正确的;但是,如果您试图缓存的
Bar
对象很复杂,或者foo
方法包含大量参数,那么我想再添加一个选项,使用SpEL可能不是生成密钥的最理想解决方案
您可能想考虑<代码>密钥生成器< /> >
例如:@Override
@Cacheable(value="barCahceKey", keyGenerator="barKeyGenerator")
public int foo(Bar bar) {
....
}
@Component
public class BarKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object o, Method method, Object... objects) {
// TODO logic to generate unique key
return "Bar_Key_Generator_With_Params_etc";
}
}
使用这种方法,您可以完全灵活地构造密钥
对于来自同一对象的键,可以使用Object.hashCode(),因此不需要逐个指定键
@Override
@Cacheable(key="#bar.hashCode()")
public int foo(Bar bar) {
....
}
或者如果您有一个对象和另一个键
@Override
@Cacheable(key="{#bar.hashCode(), #anotherKey}")
public int foo(Bar bar) {
....
}
我认为这是一个更好的解决方案。您可以使用Spring SimpleKey类
@Cacheable(value = "barCache", key = "new org.springframework.cache.interceptor.SimpleKey(#bar.id, #bar.name)")
这回答了你的问题吗?哈希代码是危险的,因为它们不能保证是唯一的。但是当我使用这种方法时,它抛出了
java.lang.ClassCastException:Invalid key type,应为:org.springframework.cache.interceptor.SimpleKey,但was:java.util.ArrayList
。我如何克服这一点?这对我有效,但为什么解决方案会给我java.lang.ClassCastException:无效的键类型,应为:org.springframework.cache.interceptor.SimpleKey,但was:java.util.ArrayList
异常?但为什么它需要key=“new org.springframework.cache.interceptor.SimpleKey(#bar.id,#bar.name)”
而不是key=“{#bar.id,#bar.name}”
如果“-”是公共静态最终字符串数据。我该怎么办?
@Cacheable(value = "barCache", key = "new org.springframework.cache.interceptor.SimpleKey(#bar.id, #bar.name)")