私は、外部IDを使って何らかのオブジェクトを取得して更新するために外部システムを呼び出すサービスを持っています。むしろオブジェクトを一つずつより一般的な目的の方法があるの取得より:彼らは非常に高価であるためSpringキャッシュ/ jsr107:キーの一部としてのリスト/コレクション引数
public interface ExternalSystem {
List<ExternalDTO> getObjects(List<String> externalIds);
void updateObjects(List<ExternalDTO> updates);
}
私はExternalSystemの上にキャッシュを入れたいと考えて呼び出します。私は単純に春の注釈置くことができるサービスの実装では
:しかし
@Cacheable("cache-external")
List<ExternalDTO> getObjects(List<String> externalIds) {}
@CacheEvict(cacheNames="cache-external", allEntries=true)
void updateObjects(List<ExternalDTO> updates);
、そのようなキャッシュは、私がexternalIdsとの交点がたくさんある場合には非常にひどく動作しますが、つまり
- 呼び出し番号1 getObjects([1,2,3,4]) - > [1,2,3,4]キーで置かれたキャッシュ
- 呼び出し番号2のgetObjects([1,2,3,4,5] ) - > [1,2,3,4,5]キーで置かれたキャッシュ
- コール#3 g [6,7,8,9]キーで置かれたetObjects([6,7,8,9]) - >キャッシュ
- コール#4 updateObjects(1) - >すべてのキャッシュを退避しますが、3番目のキャッシュは退避しません3を含む
したがって、本当に追い出されるはずのエントリだけを取り除き、そのような方法でキーを作成するカスタム戦略を実装する方法は問題ありません交差するオブジェクトはキャッシュから取り出されますか?
Upd。
- spring-cache-abstraction-with-multi-value-queries
- using-spring-cache-on-methods-that-take-an-array-or-collection
- spring-cacheable-methods-with-lists
UPD2:私は2つの同様の質問を見つけました。 ここでは、コレクション内の各アイテムのStringとExternalDTOのキャッシュペアに入れることを除いて、欲しいものに似たものがあります。 element-level-caching-of-list-to-list
など、必要なバルク操作を含む命令型APIを使用できます。カスタム実装が既にあるはずです。質問は削除についてだけではなく、Updの付属の質問をご覧ください。 –
好奇心が強い:あなたのアプリケーションは通常、一度に何個のインスタンスを要求していますか?バルクリクエストではできないが、順番にそれを行うことができない場合は、顧客からの最大レイテンシ要件を満たさないでしょうか?カスタムソリューションをご利用の場合:すべてのアプリケーションをプロファイリングしましたが、これが最も効果的な最適化ですか?ちょうど尋ねる;) – cruftex
それは良い質問ですが、たとえそれが私の場合に実行可能であっても、他の場合には実行できないかもしれません。ですから、質問は私の場合よりも一般的です。だから、私はそのような場合のために何らかの再利用可能なソリューションを探しています。私はそれを見つけることができない場合は、私は自分自身を書いて、ここに投稿する:) –