2017-02-14 12 views
0

背景:私は春にキャッシングを検討しましたが、一般的な読み取り操作の時間を節約するのに最適な方法です。私のコードは現在、多数のアイテムにわたってループしています。そこでは、特定の他のオブジェクトが共通項目を介して接続されているかどうかを確認するロジックを実行しています。これについて考える方法は、特定の商品を見るときに表示されるショッピングウェブサイトの関連商品に似ています。これを決定するために私が使用する値は複雑ですが、それが基本的な考え方です。プロセスの激しい計算の代わりに「キャッシング」の代替

アイテムページを読み込む際に、読み込みに非常に長い時間がかかり、他のアイテムが何らかの方法でリンクを表示するように計算されています。アイテムページが読み込まれるたびにこのリストを計算するのではなく、推奨アイテムのリストでアイテムをキャッシュすることを開始しました。システムの多くの物事これらの関係を再計算する必要性をトリガすることができます:アイテムを追加/削除、アイテムにプロパティを追加/削除など

問題:私の「キャッシュ」は、単に項目のための地図を含むシングルトンオブジェクトでありますおよびそれらの関連オブジェクト。キャッシュの変更が必要なときに、システム内のすべての項目を反復処理するプロセスは、非常に時間がかかり、処理が集中します。 Javaキャッシュは、アイテムの絶え間ない変更のために正解とは思われません。このデザインのために見落としている他のデザインパターンはありますか?キャッシュは近いようですが、この問題がキャッシュの型に合っているかどうかはわかりません。なぜなら、1つのアイテムに対して読み込みが少し複雑になるからです。

キャッシュはこれと一緒に行く方法ですか?キャッシングが適切な解決策でない場合、何がありますか?

+0

私は間違っている可能性がありますが、このような問題に最も適した*データ構造*を使用してオブジェクトをモデル化する最も効率的な方法を見つけなければならないという問題があります。キャッシュは参照が最終的にどこに行くのかですが、データを保持する構造は適切に考える必要があります。 – CKing

+0

私はそこに@CKingに同意します。 1つの物理的なエンティティ( 'Item')しか持たず、' ItemRelation'という論理的なエンティティを持っていて(プロパティがtypeで、そこに他のものがあれば)、問題があるようです。 ItemRelationデータにはこのような大きなニーズがあるため、アイテムを格納している類似のメディアに格納する物理エンティティとして関係を具体化してみませんか?このようにすると、何らかの変更が発生した場合にのみリレーションを計算し、リレーションデータストアで利用可能なものを読み込んだだけで、問題を解決することができます。 –

+0

@CKing @ m-prokhorov私はこれを一般的なものにしておきます: 'Item'は' Set 'です。 'Property'は、' Color'が 'Attribute'で、' Blue'が 'Value'であるところで、' Color:Blue'のような行に沿ってキー/値のペアを考えています。 'Attribute'と' Value'はそれ自身で(複雑なDBは複雑です)、すべてがすべてリンクされています。 変更があった場合にのみこの「キャッシュ」を更新していますが、新しい変更が「キャッシュ」に影響を与えるかどうかを確認するためにシステムのすべての「アイテム」をループしています削除する/何でも)。 'Property'は' Item'やその他のハンドルを保持します。 – Walls

答えて

0

キャッシュは問題の解決策ではありませんが、解決策を見つけるのに役立つと思われます。

たとえば、作成されたアイテムをキャッシュする代わりに、めったに変更されないがリストを作成するために重要な情報をキャッシュする方法があります。

キャッシングまたは無効化のために、Spring関数ベースのキャッシュ(つまり@Cachable)が便利な場合があります。

次のレベルは、さまざまな種類のキャッシュ(つまり、redis)とアルゴリズム、並べ替え、およびPub/Subの点でそれらが提供するものを調べることです。

関連する問題