1

こんにちは、Google アプリ エンジンを使用して画像ホスティング Web サイトを作成しています。各ページには 5 つの画像が含まれています。後続のページがあるかどうかを示すブール値を取得したいと考えています (日付の降順で格納されています)。ページ制限とページ番号があるため、次のようなデータストア クエリが必要です。

rownum pagenumber * pagelimit の単一の値を取得します (ページに 5 が表示された後に何かが保存されているかどうかを確認します)。

現在私は持っています:

    Query query = new Query("PicturePost").addSort("date",Query.SortDirection.DESCENDING);
    List<Entity> results;

    results = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(pageLimit)
                                    .offset(pageLimit*(pageNumber)));

    boolean lastPage = results.isEmpty();

ただし、次のページから 5 つのエンティティすべてを取得するため、これは非効率的です。

誰かが私を助けることができれば、私はとても感謝しています、ありがとう!

4

1 に答える 1

1

これは私にとってはかなりうまくいくようです。YMMV。シリアル アクセスが必要なエンティティには、常に date_created フィールド [auto_now_add=True] を含めます。ブラウザー クライアントは、number_of_images to return と date_limit の 2 つの入力を使用してハンドラー関数を呼び出す必要があります。最初の呼び出しでは、date_limit に空の文字列が含まれるため、現在のシステム日時を使用します。他の電話には、前回の電話で返信した最も早い日付が含まれます。

クエリは (date_created < date_limit) および date_created DESC になります。必要な数の画像の keys_only フェッチを実行し、キーを img src="key_goes_here" セットアップ用に送り返します。必要な数の画像よりも少ない、またはゼロを返す場合は、新しい画像が不足しています。

これがアクティブなページである場合は、自動 memcaching に ndb を使用し、コンテンツ ヘッダーにキャッシュするようブラウザに指示します。(db を使用すれば、単純な memcache 関数を非常に簡単に作成できます。) はい、これは完璧ではありません。N 個の画像を返し、次の呼び出しがゼロを返すかどうかわからないため、わずかな時間で無駄な呼び出しが発生します。非常にアクティブなサイトの場合、画像の put() に date_created が重複している可能性があります。カスタム インデックスのオーバーヘッドは発生しますが、どのようなアプローチをとっても、このコストは発生すると思います。多くの GAE と同様に、多くの場合トレードオフがあります。HTH。-スティーブ

于 2013-06-25T01:49:54.690 に答える