0

で分散キャッシュを実装しようとしていspring-memcachedます。ドキュメントは、オブジェクトをキーとして使用するには、ドメインクラスに @CacheKeyMethod アノテーションを付けたメソッドが必要であることを示唆しています。

しかし、問題は、異なるシナリオで同じドメイン クラスを使用しており、それぞれのケースで生成されるキーのロジックが異なることです。Userクラスの例では、シナリオの 1 では、 cityandに関してキーが一意である必要がありますgenderが、他のケースでは、ユーザーの に関して一意である必要がありますemail。それは基本的に、ルックアップのベースです。

ユーザーの電子メールによって都市と性別が決まるため、最初のケースでも電子メールをキーとして使用できますが、これはユーザーごとに個別のキャッシュ エントリを意味し、キャッシュされたデータは性別と都市が同じである限り同じになります。 、これにより、ヒット率が大幅に増加すると予想されます(バンガロールの男性であると予想されるユーザーの数を考えてみてください)。

異なるキーを定義する方法はありますか。また、キーを生成するロジックをドメイン クラス自体から外部化できるとよいでしょう。

私はドキュメントを読んで、何かが呼び出されたCacheKeyBuilder、および/またはCacheKeyBuilderImplトリックを実行できることを理解しましたが、続行する方法がわかりませんでした。

編集.. わかりました..私は1つの手がかりを得ました! CacheKeyBuliderImpl が行うことは、提供されたドメイン クラスのメソッドで @cachekeyannotation を検索し、見つかったメソッドを実行してキーを取得する defaultKeyProvider インスタンスで generateKey メソッドを呼び出すことです。

したがって、CacheKeyBuilderImplをカスタム Implに置き換えるか、 KeyProviderCacheKeyBuilderImpl 内の のデフォルトの実装を自分のものに置き換えるとうまくいくかもしれませんが、キープロバイダーの参照は DefaultKeyProvider に組み込まれています。

誰でも私が CacheKeyBuilder を実装するのを手伝ってもらえますか(さまざまなメソッドが何をするかに関して;ドキュメントはそれを明確にしません)、また、通常の CacheKeyBuilderImpl の代わりに使用するためにそれを注入する方法を教えてください

4

1 に答える 1

0

Simple Spring Memcached (SSM) は、このような低レベルのカスタマイズを許可するようには設計されていません。あなたが書いたように、方法の1つはCacheKeyBuilderImplを独自の実装に置き換えることです。デフォルトの実装はハードワイヤードですが、カスタムの simplesm-context.xml構成を使用して簡単に置き換えることができます。

あなたの質問を理解しているように、ユースケースに応じて異なるキーの下でUserオブジェクトをキャッシュしたいと考えています。デフォルトでは、SSM はメソッド引数を使用して結果ではなくキャッシュ キーを生成するため、すぐに使用できます。

例:

@ReadThroughMultiCache(namespace = "userslist.cityandgenre", expiration = 3600
public List<User> getByCityAndGenre(@ParameterValueKeyProvider(order = 0) String city, @ParameterValueKeyProvider(order = 1) String genre) {
  // implementation
}

@ReadThroughSingleCache(namespace = "users", expiration = 3600)
public User getByEmail(@ParameterValueKeyProvider String email) {
  // implementation
}

一般に、@CacheKeyMethodは、メソッドを含むオブジェクトがパラメーターとしてメソッドに渡され、パラメーターが@ParameterValueKeyProviderによって注釈付けされている場合にのみ、キャッシュ キーを生成するために使用されます。

于 2013-07-16T07:11:43.977 に答える