0

GAENDBデータストアから最新の10レコードを使用してRSSフィードを生成します。データベース内のレコードは毎週更新されます。ユーザーがRSSフィードの表示を要求するたびにデータストアへのクエリを回避するにはどうすればよいですか?つまり、それをキャッシュする方法は?

4

1 に答える 1

2

memcache を使用して、毎回データストアにアクセスすることを回避できます。おそらくご存じのとおり、クエリは NDB にキャッシュされません。

https://developers.google.com/appengine/docs/python/memcache/usingmemcache

def get_data():
  data = memcache.get('key')
  if data is not None:
      return data
  else:
      data = self.query_for_data()
      memcache.add('key', data, 60)
      return data

つまり、memcache からデータを取得してみて、データストアからの取得に失敗した場合は、次回のために memcache に追加します。

上記の例では、60 秒のタイムアウト (.add 呼び出しの値 60) を使用しています。memcache が許可する限り、データを保持するには、その引数をそのままにしておきます。

また、同様の質問から: NDB Caching When Using Projected Queries

key.get() はキャッシュされ、キャッシュから取得されますが、query.get() はキャッシュから取得されません。 https://developers.google.com/appengine/docs/python/ndb/cache

ドキュメントから: クエリはキャッシュ内の値を検索しません。ただし、キャッシュ ポリシーで指定されている場合、クエリ結果はインコンテキスト キャッシュに書き戻されます (ただし、Memcache には書き込まれません)。

そのため、キーで取得すると、代わりに NDB キャッシュから自動的に取得されるように見えますが、私は個人的にそれを使用していません。

したがって、RSS コンテンツを作成し、レンダリングする直前に memcache に保存します。次に、作成元のコンテンツを更新するときに、キャッシュされたバージョンを無効にするだけで (ドキュメントを参照)、次のリクエストでデータストアからコンテンツが取得され、キャッシュに戻すことができます。

于 2012-10-01T16:42:54.527 に答える