順序付け/プロパティを変更できるページ分割された結果をキャッシュするためのベストプラクティスは何ですか?


11

順序付け/プロパティを変更できるページ分割された検索結果をキャッシュするためのベストプラクティスは何ですか?

私のアプリケーションでは、誰かが最新の20のディスカッションスレッド(10,000のうち)を見たいとします。servletXML、JSONとしてディスカッションスレッドテーブルから最初の20レコードを取得するために、を介してデータベースにリクエストが送信されます。その後、次の20を表示したい場合、結果の次のページに移動し、次のロットを取得するための別の要求を開始します(制限とオフセット= 20など)。

サーバーの負荷とクライアント待機を減らすために、結果の前のページをキャッシュしたいと思います。ただし、2つの質問があります。

  1. 結果が表示されるテーブルは、複数の属性(つまり、thread-creation-date、thread-author、last-post-date)で並べ替えることができます。これは、「最初の20件の結果」のような文は、コンテキストなしでは意味をなさないことを意味します(つまり、私たちは何によって注文するのか)。それでは、フロントエンドはどのようにしてバックエンドに既にロードしたものと通信しますか?最初に考えたのは、各結果にIDを使用することでしたが、後続のリクエストでIDをサーバーに送り返す(およびそれらに基づいて結果をフィルタリングする)のは、すべてを盲目的に送り返すのと同じくらい時間がかかります。これどうやってするの?
  2. 以前に返された結果(つまり、最新のポスト日付)の属性が変更された場合はどうなりますか?次に、各結果をチェックインして、ページインされてからサーバー側で変更されているかどうかを確認する方法が必要です。これを行うにはどうすればよいですか?

あなたの例は少し荒いです。スレッドが100個しかない場合は、100個すべてを一度にダウンロードすることをお勧めします。10,000のうち20を引いている場合、それは別の話です。
ダンピチェルマン

@DanPichelman申し訳ありませんが、私は少し不明瞭でした。それは10,000に近いでしょう。
goodsquishy

わかりやすくするために番号を編集しました。
goodsquishy

これはhttpですか?もしそうなら、なぜURLに基​​づいて単にキャッシュしないのですか?URLにすべてのパラメーターがあります。ブラウザの場合は、ブラウザのキャッシュを利用してみてください。アプリの場合、キャッシュの有効期限を設定します。AndroidのVolleyは非常にうまく機能します。
冷ややかな素晴らしい

回答:


7

あなたがページを定義するすべてのパラメータのラッパーです(と言う必要があるものと思われるpageNumberpageSizesortTypetotalCount、など)と、この使用DataRequestあなたのキャッシュメカニズムのためのキーとしてオブジェクトを。この時点から、キャッシュを処理する多くのオプションがあります。

  • 何らかのタイムアウトメカニズムを実装して、キャッシュを更新します(データが変更される頻度に基づいて)。
  • データベースの変更をチェックし、上記のパラメーターに基づいてキャッシュを更新するリスナーを用意します。
  • 変更が同じプロセスで行われる場合、変更ごとにキャッシュを常に期限切れとしてマークし、ページが要求されたときにこのフラグをチェックできます。

最初の2つは、ある間隔で、またはイベントに基づいてトリガーするスケジューラーメカニズムを伴う場合があります。データアクセスポイントが1つしかない場合は、最後の方が簡単です。

最後に、@ DanPichelmanが言及したように、それはすぐに利点を上回る非常に複雑なアルゴリズムになる可能性があるため、パフォーマンスの向上がアルゴリズムの複雑さを正当化することを確認してください。


3

おそらく次のように処理します。

  1. 異なる順序をすべて異なるシーケンスとしてまとめて扱います。各クライアントが何を持っているかを追跡する(または繰り返し送信する)ことは余分な簿記の価値はありません。
  2. ユーザーがページを表示するたびに、キャッシュからすぐに表示すると同時に、ハッシュまたは最終アクセス時刻を含むGETをサーバーに送信します。サーバーは、何かが変更された場合にのみページ全体を送り返します。
  3. サーバーから一度に複数のUIページを取得します。たとえば、UIに20エントリ、クエリ60が表示される場合、これをテストする必要がありますが、最も効率的な戻りサイズは通常、1ページに表示されるデータの平均量よりも大きいと予想されます。これにより、一部のページターンでUIの応答性が非常に高くなります。
  4. 境界に近づくと、プリフェッチが再実行されます。これにより、キャッシュからのこれらの高速ロード時間が維持されます。

2

ちょっと考えてみてください-サーバー呼び出しで、通常のパラメーターと、現在キャッシュされている以前に表示されたデータのページを表すMD5ハッシュの配列を渡します。

リターンコールには、新しい現在のページのすべての通常のデータに加えて、以前に表示した古いページの更新が含まれます。古いハッシュをキーとして使用できます。

最初に多くのパフォーマンスとタイミングのテストをお勧めします-クライアント側のコードは、データの各ページごとにサーバーにアクセスする場合よりもはるかに複雑になります。余分な複雑さが意味のある改善につながることを確認してください。


ご回答有難うございます。ハッシュについて考えていましたが、並べ替えのシナリオに役立つかどうかはわかりません(つまり、十分に細かくなく、結果ごとではなくページごとにのみ動作します)。あなたの最後の段落は良い点だと思うし、可能なソリューションの複雑さはパフォーマンスの利点を上回ると考え始めています。
goodsquishy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.