Кэширование набора запросов Django для календарной даты - PullRequest
2 голосов
/ 27 января 2011

У меня есть запрос, результаты которого меняются только один раз в день.Похоже, тратить на выполнение этого запроса каждый запрос, который я получаю для этой страницы.Я изучаю использование memcached для этого.

Как мне начать?У кого-нибудь есть какие-либо предложения или подводные камни, которых мне следует избегать при использовании кеширования Django?Должен ли я кешировать в шаблоне или в представлении?

Этот вопрос может показаться расплывчатым, но это только потому, что я никогда раньше не занимался кешированием.Поэтому, если есть что-то, что я мог бы уточнить, , пожалуйста, , просто спросите.

Разработка

За Кена Кокрейна:

  1. Как часто эти данные изменяются : соответствующие данные будут заблокированы на эту календарную дату.Так, например, я получу данные за 30.01.2011, и я в порядке с обслуживанием этой кэшированной копии за весь день до 31.01.2011, где она будет обновлена.

  2. Могу ли я использовать эти данные в более чем одном месте: Только в одном представлении.

  3. Сколько будет данных?: В среднем 10 объектов модели содержат около 15 полей, наибольшее из которых - CharField(max_length=120).Я урежу количество полей с помощью values() примерно до половины из них.

Ответы [ 2 ]

8 голосов
/ 30 января 2011

Обычно, прежде чем я решаю, где выполнять кэширование, я задаю себе несколько вопросов.

  1. Как часто эти данные меняются
  2. Могу ли я использовать эти данные в более чем одном месте
  3. Сколько данных это будет

Поскольку я не знаю всех деталей вашего приложения, я собираюсь сделать некоторые предположения.

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

При кэшировании шаблона или просмотра необходимо следить за следующим

  1. установите время ожидания кеша так, чтобы оно не было слишком большим, я не думаю, что вы можете программно изменить время ожидания кеша шаблона, и оно жестко запрограммировано, так что, если вы установите слишком большое значение, у вас будет страница это устарело. Вы должны иметь возможность программно изменять время кэширования, поэтому оно немного безопаснее.
  2. Если вы кешируете шаблон, и в нем есть другая информация, которая является динамической и постоянно изменяется, убедитесь, что вы на некоторое время размещаете только метки кэша в той части страницы, которую хотите кэшировать. Если вы поставите его не в том месте, вы можете получить неправильный результат.

Надеюсь, это даст вам достаточно информации, чтобы начать. Удачи.

1 голос
/ 27 января 2011

Попробуйте прочитать это в первую очередь.У Django есть возможность {% cache for_seconds что-то%}. Просто используйте кеш-тег.http://docs.djangoproject.com/en/dev/topics/cache/

...