Вопрос

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

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

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

Разработка

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

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

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

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

Это было полезно?

Решение

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

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

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

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

С этими предположениями у вас есть 3 варианта. 1. Кэшируйте шаблоны 2. кэшируйте представление 3. Кэш -запрос

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

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top