通常、どこでキャッシングを行うかを決める前に、いくつかの質問を自問します。
- このデータはどのくらいの頻度で変更されますか
- このデータを複数の場所で使用しますか?
- どのくらいのデータになりますか
私はあなたのアプリケーションの詳細をすべて把握しているわけではないので、いくつかの仮定を立てます。
- 日付を取得するか、現在の日付を使用してデータベースにクエリを実行し、その日付のすべてのカレンダー イベントを引き出すビューがあります。
- この情報を 1 つのテンプレートにのみ表示し、
- データ量が多すぎない (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
キャッシング時の注意点
- キャッシュに保存しているオブジェクトがピクルできることを確認してください
- memcache は今日が何日かわからないため、キャッシュを使いすぎないようにする必要があります。たとえば、1 月 21 日の正午で 24 時間キャッシュした場合、そのカレンダー情報は 1 月 22 日の正午まで表示され、探しているものではない可能性があるため、クエリの時間を設定するときに確認してください。有効期限が早くなるように小さな値に設定するか、有効期限が切れるタイミングで有効期限が切れるようにキャッシュする時間を計算します。
- キャッシュするオブジェクトのサイズを確認してください。memcache インスタンスに 16 MB のストレージしかなく、32 MB のデータを保存したい場合、キャッシュはあまり役に立ちません。
テンプレートまたはビューをキャッシュするときは、次の点に注意する必要があります
- キャッシュのタイムアウトが大きすぎないように設定してください。テンプレートのキャッシュのタイムアウトをプログラムで変更することはできないと思います。ハードコードされているため、設定が高すぎると、ページが表示されなくなります。日付の。プログラムでキャッシュ時間を変更できるはずなので、少し安全です。
- テンプレートをキャッシュしていて、テンプレートに動的で常に変化する他の情報がある場合は、キャッシュ タグをページのセクションの周りにしばらくの間だけ配置するようにしてください。間違った場所に置くと、間違った結果になる可能性があります。
うまくいけば、開始するのに十分な情報が得られます。幸運を。