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