2

そのため、最近、HRDとNDBに関する多くのドキュメントを読んでいますが、NDBがどのように物事をキャッシュするかについてはまだ疑問があります。

例:

ユーザーがデータを書き込み、アプリが書き込みの直後にデータをフェッチする必要がある場合を想像してみてください。たとえば、ユーザーが「グループ」(Facebook / LinkedInグループと同様)を作成し、作成後すぐにグループにリダイレクトされます。(今のところ、祖先を割り当てずにグループを作成しています)

結果:

この種の機能をローカルでテストする場合(高レプリケーションを有効にした場合)、新しく作成されたグループの即時フェッチは失敗します。NoneTypeが返されます。

質問:

ハイレプリケーションのドキュメントとGoogleIOビデオを読んだ後、書き込みレイテンシが高くなることを理解しましたが、NDBキャッシングでこれを処理するべきではありませんか?つまり、書き込みはキャッシュされ、非同期で実際にディスクに書き込まれるため、即時読み取りはキャッシュからの読み取りであり、問​​題はありません。他の設定を強制する必要がありますか?

4

2 に答える 2

2

NoneTypeが返されるのはリダイレクトのせいかもしれません。

https://developers.google.com/appengine/docs/python/ndb/cache#incontext

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

したがって、値をキャッシュに書き込んでリダイレクトすると、リダイレクトのHTTPリクエストが異なるため、キャッシュが異なるため、読み取りが失敗します。

私はここで私の知識の限界に達していますが、最初はトランザクションで作成を試み、完了/成功したときにリダイレクトすることをお勧めします。

https://developers.google.com/appengine/docs/python/ndb/transactions

また、グループモデルをデータストアに配置すると、キーが返されます。そのキーを(たとえばurlsafeを介して)リダイレクトに渡すことができます。そうすれば、明示的なキーを持っているので、データを取得することが保証されますか?結局のところ、データストアにない場合はキーを取得できません。

また、本番サーバーでそのまま試してみることをお勧めします。ローカルと本番サーバーでは動作が大きく異なる場合があります。

于 2012-09-11T11:14:51.510 に答える
2

クエリが「結果整合性」であるHRD機能に遭遇していることを確認してください。NDBのキャッシュは、この動作とは何の関係もありません。

于 2012-09-11T21:47:30.913 に答える