web-dev-qa-db-ja.com

ハイブリッドページネーションスキームの最適化

私はnode.jsを使用してWebアプリケーションに取り組んでいます。サーバーの負荷を軽減するために、クライアント側でデータベースの部分的なコピーを構築しています。現在、私はこのような関数を持っています(pythonスタイルの擬似コードとして表現されますが、JavaScriptで実装されています):

get(table_name,primary_key):
    if primary_key in cache[table_name]:
        return cache[table_name][primary_key]
    else:
        x = get_data_from_server(table_name,primary_key) # socket.io
        return cache[table_name][primary_key] = x

このスキームは個々の行をキャッシュするのに完全に機能しますが、primary_keyに従って順序付けられたページ付けされたテーブルの作成をサポートし、現在のページと場合によっては隣接するページに対してのみ上記の関数を使用して追加データをロードするように拡張したいと思います。今、私はページを変更する必要があるたびにサーバー上の主キーのリストを保持したくないので(ここでは範囲外の理由で頻繁に表示されます)、クライアントに保持しますサーバーからのリアルタイムの作成/削除イベントの影響を受ける側は、圧縮後(個々の値の代わりに範囲を使用)でも、それほど良い考えではないようです。

ランダムなページに表示されるアイテムを計算し、スペース要件とサーバーとの通信の必要性を最小限に抑えるための最良の方法は何ですか?

4

コード内のアイテムを処理している場合ではなく、ioを待機しているときにノードが非ブロッキングであることに注意してください。ノードを使用して大規模なデータセットをループまたは操作する場合は、その作業をデータベースまたは他のプロセスにオフロードすることを検討してください。

また、データベースロジック(主キー、行)とアプリケーションロジック(ユーザービュー、モデル)を1つのキャッシュ関数に結合しようとしているようにも見えます。データベース層とアプリケーション層で最適化する2つのアプローチを検討してください。

データベースレベルで、データベースの使用状況を調べ、EXPLAINを使用し、インデックスの使用状況を調べ、N +1およびその他の繰り返されるデータベース呼び出しを削除します。

アプリケーションレベルでは、ページ(特に初期読み込み時)をテーブルや行ではなくビュー全体と見なします。次に、最も一般的なビューに必要なすべてのデータをキャッシュします。同じデータがすべてのユーザーに提示される場合は、レンダリングされた出力全体をキャッシュすることを検討してください。 ajax呼び出しを使用する場合は、キャッシュされたデータの初期セットをhtml応答内に埋め込まれたjsonとして保存することを検討してください。また、キャッシュが保存されている場所も確認してください。redisとmemcachedは、ライブサイトデータの一般的なデータストアです。

参照:-NodeJSイベントループ: http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ -MVVMアーキテクチャ: http://addyosmani.com/blog/understanding-mvvm-a-guide-for-javascript-developers/ -Nodejsページキャッシュ: https://stackoverflow.com/questions/9715636/node- js-page-caching

1
FMJaguar

サーバーでページ付けが行われている場合、すでに小さなサブセットが返されていませんか?

サーバーに、要求されたページの主キーのリストのみを返すようにすることができます。キャッシュからできるだけ多くを実体化し、サーバーから残りのIDを1回の呼び出しで一括フェッチします。

0
Joppe