django の低レベルの cache.set() 中に何が起こるかを理解しようとしています 特に、クエリセットのどの部分が memcached に格納されるかについての詳細。
まず、django ドキュメントを正しく解釈していますか?
- クエリセット (python オブジェクト) は独自のキャッシュを持っている/維持しています
- データベースへのアクセスは遅延です。queryset.count が 1000 であっても、1 レコードに対して object.get を実行すると、その 1 レコードに対して dbase は 1 回だけアクセスされます。
- apache prefork MPM を介して django ビューにアクセスするとき、特定のデーモン インスタンス X が「tournres_qset = TournamentResult.objects.all()」のようなものを含む特定のビューを呼び出すたびに、これは毎回、新しいtournres_qset オブジェクトが作成されています。つまり、以前の (tcp/ip) アクセスから tournres_qset python オブジェクトによって内部的にキャッシュされた可能性があるものはすべて、新しいリクエストの tournres_qset によってまったく使用されません。
ビュー内の memcached への保存に関する質問です。ビューの上部に次のようなものを追加するとします。
tournres_qset = cache.get('tournres', None)
if tournres_qset is None:
tournres_qset = TournamentResult.objects.all()
cache.set('tournres', tournres_qset, timeout)
# now start accessing tournres_qset
# ...
cache.set() 中に何が保存されますか?
クエリセット (python オブジェクト) 全体がシリアル化されて保存されますか?
クエリセットはまだレコードを取得するために使用されていないため、特定のレコードのコンテンツが実際に memcache に保存されていないため、これは単なる時間の無駄ですか? (今後のリクエストでは、memcache から queryset オブジェクトが取得されます。memcache は、空のローカル クエリセット キャッシュで常に新しく開始されます。dbase へのアクセスは常に行われます。)
上記が当てはまる場合、ビュー全体でいくつかのレコードにアクセスするためにクエリセットが使用された後、ビューの最後にクエリセットを常に再保存する必要があります。これにより、クエリセットのローカルキャッシュが更新されます。常に memcached に再保存されますか? ただし、これにより、クエリセット オブジェクトが再度シリアル化されることになります。物事をスピードアップするのはこれで終わりです。
または、cache.set() は queryset オブジェクトを強制的に反復させ、dbase からすべてのレコードにアクセスさせます。これは memcache にも保存されますか? ビューがクエリ セットのサブセットにしかアクセスしない場合でも、すべてが保存されますか?
あらゆる方向に落とし穴があり、多くのことを誤解していると思います。
これが理にかなっていることを願っており、いくつかの「標準」ガイドラインへの説明またはポインタを高く評価しています。ありがとう。