1

Google App Engine NDBを使用すると、memcacheのほとんどの側面が自動的に処理されます。ただし、アイテムは、少なくとも1回読み取られるまで、Memcacheで使用可能になりません。したがって、最初にアイテムをgetを使用して読み取る必要があり、次にmemcacheがそれを保存します。Put()はそれをmemcacheから削除します。

ただし、置くとすぐにmemcacheで利用できるものが必要です。私はmemcacheを初めて使用するため、すべてが舞台裏でどのように機能するか完全にはわかりませんが、これを行うには2つの方法があります。

  1. エンティティのput()の直後に、get()を実行して、memcacheで使用できるようにします。
  2. put()の直後に、memcacheにアイテムを手動で設定します。これは理にかなっていますが、このアプローチにゴタチャがあるかどうかはわかりません。memcacheに手動で何かを設定した場合、これはNDBの残りの自動memcache処理に干渉しますか? また、memcacheに手動で何かを設定する場合、get時に自動memcacheハンドラーが何を探すべきかを認識できるように、どのキーを使用する必要がありますか?
4

1 に答える 1

1

私はあなたがこれを参照していると思います:

Memcacheはトランザクションをサポートしていません。したがって、データストアとmemcacheの両方に適用されることを意図した更新は、2つのうちの1つにのみ行われる可能性があります。このような場合に一貫性を維持するために(おそらくパフォーマンスを犠牲にして)、更新されたエンティティはmemcacheから削除されてから、データストアに書き込まれます。後続の読み取り操作では、memcacheから欠落しているエンティティを検出し、データストアから取得して、読み取りの副作用としてmemcacheで更新します。また、トランザクション内のNDB読み取りはMemcacheを無視します。

したがって、プットで利用できるものが必要な場合は、自分でmemcacheにキャッシュする必要があります。

これは2)に私たちをもたらします

memcache AFAIKに手動で何かを設定した場合、それはNDBの自動キャッシュとはまったく相互作用しません。また、自動バージョンが自動的に機能するキーを使用して手動のmemcacheエントリを設定することはできません。

明示的に制御するコンテンツの周囲にmemcacheのレイヤーを構築するだけです。putを実行するたびに、データストアに配置してからmemcacheに配置する関数を使用し、必要に応じて既存のエントリを無効にします。同様に、getの場合、最初にmemcacheを試し、次にデータストアにフォールバックします。これは、NDBがすでに行っていることとほぼ同じように聞こえます。

おそらく、より細かく制御するためのポリシー関数オプションを見てください: https ://developers.google.com/appengine/docs/python/ndb/cache#policy_functions

ただし、コンテキスト内キャッシュがすでに必要なことを実行している可能性があることを忘れないでください。

インコンテキストキャッシュは、単一の着信HTTPリクエストの期間のみ存続し、そのリクエストを処理するコードにのみ「表示」されます。これは速い; このキャッシュはメモリ内にあります。NDB関数がデータストアに書き込むとき、コンテキスト内のキャッシュにも書き込みます。NDB関数がエンティティを読み取るとき、最初にコンテキスト内キャッシュをチェックします。エンティティがそこで見つかった場合、データストアの相互作用は発生しません。

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

したがって、putと後続のgetが同じリクエストで発生している場合は、いずれの場合もコンテキスト内のキャッシュから出力されます。

于 2012-11-05T11:07:41.980 に答える