Обычно, прежде чем я решаю, где выполнять кэширование, я задаю себе несколько вопросов.
- Как часто эти данные меняются
- Могу ли я использовать эти данные в более чем одном месте
- Сколько данных это будет
Поскольку я не знаю всех деталей вашего приложения, я собираюсь сделать некоторые предположения.
- у вас есть представление, которое либо берет дату, либо использует текущую дату для запроса к базе данных, чтобы извлечь все события календаря за эту дату.
- Вы отображаете эту информацию только на одном шаблоне,
- Объем данных не слишком велик (менее 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 не знает, какой сегодня день, вам нужно убедиться, что вы не перегружаете кеш. Например, если 21 января был полдень, а вы кэшируете в течение 24 часов, эта информация календаря будет отображаться до полудня 22 января, и это может быть не то, что вы ищете, поэтому убедитесь, что при установке времени запроса вы либо установите для него небольшое значение, чтобы он истекал быстрее, либо вы рассчитываете, как долго будет храниться кеш, чтобы он истекал, когда вы хотите, чтобы он истек.
- Убедитесь, что вы знаете размер объектов, которые хотите кэшировать. Если ваш экземпляр memcache имеет только 16 МБ памяти, но вы хотите хранить 32 МБ данных, кэш не принесет вам большой пользы.
При кэшировании шаблона или просмотра необходимо следить за следующим
- установите время ожидания кеша так, чтобы оно не было слишком большим, я не думаю, что вы можете программно изменить время ожидания кеша шаблона, и оно жестко запрограммировано, так что, если вы установите слишком большое значение, у вас будет страница это устарело. Вы должны иметь возможность программно изменять время кэширования, поэтому оно немного безопаснее.
- Если вы кешируете шаблон, и в нем есть другая информация, которая является динамической и постоянно изменяется, убедитесь, что вы на некоторое время размещаете только метки кэша в той части страницы, которую хотите кэшировать. Если вы поставите его не в том месте, вы можете получить неправильный результат.
Надеюсь, это даст вам достаточно информации, чтобы начать. Удачи.