1

Spring Cacheの抽象化により、メソッドの結果を簡単にキャッシュできますが、コレクション(AFAIC)に関しては、コレクションの結果をキャッシュするだけであり、多くのユーザーがコレクション内の要素を共有する場合は必ずしも効率的ではありません。

私が探しているのは、リードスルーキャッシュを作成するための良い方法です。そして、私はそれを行うための最良の方法についていくつかの提案を探しています。

このシナリオでは、さまざまなユーザーから投稿を取得しています(FBウォールを想像してください)。投稿には、タイトル、説明、ポスターの写真など、ユーザーごとに共通の側面があります。また、ユーザーに固有のものもあります。「あなたと3人の友達はこのようになっています。」

私のサービスレイヤーには基本的にこのようなメソッドがあります

public List<Post> getPosts(User user, int start, int max){
   //get the ids 
   List<Long> ids = dao.getPostIds(user, start, max);

   //get the associated posts
   List<Post> posts = dao.getPosts(ids);

   //personalize result
   return convert(posts, user);
}

Postオブジェクトは、Hibernateが管理するPostエンティティの派生物です。怠惰なコレクションをすべて含むHibernate管理対象エンティティ全体を取得し、場合によっては不要な初期化は大量の読み取りの理想的な候補ではないと常に感じているため、これらのエンティティの値を単純なPostBeanに投影します。誰かがその感覚について何か考えを持っているなら、それも面白いでしょう。

PostIdは、新しい投稿が入ると頻繁に更新されるものです。友達と同じ投稿がいくつか表示されるので、投稿自体をユーザー間で共有できます。コンバージョンはエンドユーザーに固有のものです。

だから、私はこれをサポートするためにキャッシュを使用できるようにしたいと思います。短期間のIDキャッシュとLFUポストキャッシュ。これは多かれ少なかれ第2レベルのHibernateキャッシュが機能する方法ですが、誰かが私を他の方法で納得させることができない限り、それはありません。また、これをチェーンの少し上位で使用して、リクエストごとにオブジェクトにハイドレイトする必要がある値の配列だけでなく、オブジェクトをキャッシュできるようにします。

したがって、LFUキャッシュは、id-postのいずれかがキャッシュ内にあるかどうかを確認し、データベースから欠落しているアイテムを別のgetPosts(ids)で取得し、それらをキャッシュに入れて、すべてが結果を返します。

たくさんの車輪を発明する必要がない、これを行う良い方法はありますか?すべてではないにしても、ほとんどのドキュメントは、このよりきめ細かいリードスルーアプローチを実現する方法を説明せずに、メソッドの結果全体をキャッシュすることに焦点を当てているようです。

任意の提案をいただければ幸いです。

よろしく、マーク

4

0 に答える 0