GAENDBデータストアから最新の10レコードを使用してRSSフィードを生成します。データベース内のレコードは毎週更新されます。ユーザーがRSSフィードの表示を要求するたびにデータストアへのクエリを回避するにはどうすればよいですか?つまり、それをキャッシュする方法は?
1 に答える
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 に保存します。次に、作成元のコンテンツを更新するときに、キャッシュされたバージョンを無効にするだけで (ドキュメントを参照)、次のリクエストでデータストアからコンテンツが取得され、キャッシュに戻すことができます。