缓存密钥生成

时间:2009-09-10 20:24:09

标签: java caching groovy ehcache

我正在使用ehcache(通过Grails插件)。将对象添加到缓存的方法要求密钥可序列化,因此典型的用法是:

def key = 22
def someObject = new Object();
cacheService.cache(key, true, someObject)

(布尔参数指示是否应将对象添加到分布式或本地缓存中)

我的问题是如何从值对象生成密钥,例如:

class Person implements Serializable {
  String firstName
  String lastName
  Integer age
}

一种方法是提供hashCode()和equals()方法,并使用hashCode作为键。在这种情况下,我不需要使Person类实现Serializable。

或者,我可以简单地使用Person对象本身作为键。看起来我仍然需要提供equals和hashCode方法,但是还需要实现Serializable。但是,使用此方法发生冲突的可能性似乎较小,因为Person只能等于另一个Person实例。

我假设ehcache使用密钥的equals()方法来确定缓存中是否已存在该密钥,这个假设是否正确?

上述任何一种方法本质上都比其他方法更好,还是有其他方法我没有考虑过?

谢谢, 唐

1 个答案:

答案 0 :(得分:1)

您的hashkey问题主要与可序列化问题正交。在回答hashkey时,我会使用Apache Commons HashCodeBuilder。它为您完成所有繁重的工作。与equals类似,使用EqualsBuilder。

请记住,哈希码需要在对象的生命周期内保持不变,因此只对那些不会改变的内部元素进行哈希处理。

我会避免使用Person对象作为键,因为它会调用它的equals()来检查键比较,这可能比比较整数哈希码要慢。