3

結果が1日1回だけ変わるクエリがあります。そのページに対して取得したすべてのリクエストでそのクエリを実行するのは無駄のようです。これにmemcachedを使用して調査しています。

どうやって始めますか?Djangoのキャッシングを使用する際に避けるべき提案や落とし穴はありますか?テンプレートまたはビューでキャッシュする必要がありますか?

この質問は曖昧に見えるかもしれませんが、それは私がこれまでキャッシングを扱ったことがないからです。それで、私が詳しく説明できることがあれば、ただ尋ねてください。

精緻化

ケンコクランによる:

  1. このデータはどのくらいの頻度で変更されますか:関連するデータはその暦日にロックインされます。したがって、たとえば、2011年1月30日のデータを取得し、2011年1月31日まで、キャッシュされたコピーを1日中提供して更新されます。

  2. このデータを複数の場所で使用しますか: 1つのビューでのみ使用します。

  3. データ量は次のようになります。約15個のフィールドを含む平均10個のモデルオブジェクトで、最大のものはCharField(max_length=120)です。フィールド数をvalues()半分程度に減らします。

4

3 に答える 3

9

通常、どこでキャッシングを行うかを決める前に、いくつかの質問を自問します。

  1. このデータはどのくらいの頻度で変更されますか
  2. このデータを複数の場所で使用しますか?
  3. どのくらいのデータになりますか

私はあなたのアプリケーションの詳細をすべて把握しているわけではないので、いくつかの仮定を立てます。

  1. 日付を取得するか、現在の日付を使用してデータベースにクエリを実行し、その日付のすべてのカレンダー イベントを引き出すビューがあります。
  2. この情報を 1 つのテンプレートにのみ表示し、
  3. データ量が多すぎない (100 エントリ未満)。

これらの仮定では、3 つのオプションがあります。1. テンプレートをキャッシュする 2. ビューをキャッシュする 3. クエリセットをキャッシュする

通常、キャッシュを行うときはクエリセットをキャッシュします。これにより、データをキャッシュする方法をより細かく制御でき、キャッシュされた同じデータを複数の場所で再利用できます。

クエリセットをキャッシュする最も簡単な方法は、問題のモデルの ModelManger でこれを行うことです。クエリとキャッシュを処理する get_calender_by_date(date) のようなメソッドを作成します。大まかなモックアップはこちら

CACHE_TIMEOUT_SECONDS = 60 * 60 * 24 # this is 24 hours

class CalendarManager(models.Manager):

    def get_calendar_by_date(self, by_date):
        """ assuming date is a datetime object """
        date_key = by_date.strftime("%m_%d_%Y")
        cache_key = 'CAL_DATE_%s' % (date_key)
        cal_date = cache.get(cache_key)
        if cal_date is not None:
            return cal_date

        # not in cache get from database
        cal_date = self.filter(event_date=by_date)

        # set cal_date in cache for later use
        cache.set(cache_key, cal_date, CACHE_TIMEOUT_SECONDS)
        return cal_date

キャッシング時の注意点

  1. キャッシュに保存しているオブジェクトがピクルできることを確認してください
  2. memcache は今日が何日かわからないため、キャッシュを使いすぎないようにする必要があります。たとえば、1 月 21 日の正午で 24 時間キャッシュした場合、そのカレンダー情報は 1 月 22 日の正午まで表示され、探しているものではない可能性があるため、クエリの時間を設定するときに確認してください。有効期限が早くなるように小さな値に設定するか、有効期限が切れるタイミングで有効期限が切れるようにキャッシュする時間を計算します。
  3. キャッシュするオブジェクトのサイズを確認してください。memcache インスタンスに 16 MB のストレージしかなく、32 MB のデータを保存したい場合、キャッシュはあまり役に立ちません。

テンプレートまたはビューをキャッシュするときは、次の点に注意する必要があります

  1. キャッシュのタイムアウトが大きすぎないように設定してください。テンプレートのキャッシュのタイムアウトをプログラムで変更することはできないと思います。ハードコードされているため、設定が高すぎると、ページが表示されなくなります。日付の。プログラムでキャッシュ時間を変更できるはずなので、少し安全です。
  2. テンプレートをキャッシュしていて、テンプレートに動的で常に変化する他の情報がある場合は、キャッシュ タグをページのセクションの周りにしばらくの間だけ配置するようにしてください。間違った場所に置くと、間違った結果になる可能性があります。

うまくいけば、開始するのに十分な情報が得られます。幸運を。

于 2011-01-30T15:33:47.283 に答える
1

まずはこれを読んでみてください。Django には {% cache for_seconds something %} 機能があります。キャッシュ タグを使用するだけです。 http://docs.djangoproject.com/en/dev/topics/cache/

于 2011-01-27T16:59:55.663 に答える