2

私はehcacheを使用しています(Grailsプラグイン経由)。オブジェクトをキャッシュに追加するメソッドでは、キーをシリアライズ可能にする必要があるため、一般的な使用法は次のようになります。

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

(boolean パラメータは、オブジェクトを分散キャッシュまたはローカル キャッシュに追加する必要があるかどうかを示します)

私の質問は、次のような値オブジェクトからキーを生成する方法です。

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

1 つのアプローチは、hashCode() および equals() メソッドを提供し、hashCode をキーとして使用することです。この場合、Person クラスに Serializable を実装させる必要はありません。

あるいは、単に Person オブジェクト自体をキーとして使用することもできます。equals メソッドと hashCode メソッドを提供する必要があるようですが、Serializable を実装する必要もあります。ただし、Person は Person の別のインスタンスとしか等価にならないため、このアプローチを使用すると衝突の可能性が低くなるように思われます。

ehcache はキーの equals() メソッドを使用して、そのキーがキャッシュに既に存在するかどうかを判断すると仮定していますが、この仮定は正しいですか?

上記で概説したアプローチのいずれかが他のアプローチよりも本質的に優れているか、または私が考慮していない別のアプローチがありますか?

ありがとう、ドン

4

1 に答える 1

2

ハッシュキーの質問は、シリアル化可能な質問とほぼ直交しています。ハッシュキーへの回答として、ApacheCommonsHashCodeBuilderを使用します。それはあなたのためにすべての重労働を行います。同様に、equalsの場合は、EqualsBuilderを使用します。

ただし、ハッシュコードはオブジェクトの存続期間中同じである必要があるため、変更されない内部要素のみをハッシュすることを忘れないでください。

Personオブジェクトをキーとして使用することは避けたいと思います。これは、equals()を呼び出してキーの比較をチェックするためです。これは、整数のハッシュコードを比較するよりも遅い可能性があります。

于 2009-09-10T21:47:27.697 に答える