Кэширование страниц с использованием отложенной работы - PullRequest
4 голосов
/ 17 января 2011

Привет всем, если вы когда-либо писали на [craigslist], этот вопрос должен иметь смысл для вас.Всякий раз, когда вы публикуете объявление (например, для продажи мебели или квартиры), ваше объявление не сразу появляется на сайте.Скорее, списки будут появляться в пакетном режиме (номера варьируются) примерно каждые 10-15 минут.Сначала я действительно задумывался над этим поведением, пытался хранить записи, а затем делал массовые вставки, но понял, что это намного проще.После разговора с некоторыми коллегами стало понятно, что Craigslist кэширует их страницы, а затем очищает этот кэш каждые 10-15 минут.Это сильно снижает нагрузку на их базу данных.

Теперь к моему вопросу.Как мне сделать то же самое в Rails?Я знаю, как реализовать кэширование - я прочитал [руководство по кэшированию с Rails].Я буду использовать кэширование действий и фрагментирование (потому что я не могу кэшировать всю страницу).Мне все еще нужно выполнять проверки и контроль доступа, поэтому я не могу полностью кэшировать страницу ...

Ответы [ 3 ]

5 голосов
/ 20 января 2011

Для выполнения кэширования страниц по расписанию вы можете использовать стандартное кэширование Rails плюс немного умного времени.

Сначала вы хотите определить свой уровень кеширования. У вас есть три варианта:

  1. Кэширование страницы - кэширует всю страницу, но последующие запросы не проходят через стек Rails. Так что, если это страница Craiglist-esque, которая будет попадать тысячи раз в секунду, этот запрос будет направлен только на ваш веб-сервер (например, apache), а не на Rails, или на вашу базу данных, что сделает его намного быстрее. Компромисс в том, что вы теряете аутентификацию, переменные сеанса и т. Д., Которые предоставляет Rails.
  2. Кэширование действий - кэширует всю страницу, но переносит запрос в Rails, чтобы он мог выполнять любые фильтры, связанные с этим действием.
  3. Кэширование фрагментов - кэширует сегмент страницы, по сути, обходя необходимость выполнения кода в блоке (и любые последующие обращения к БД).

Затем вам нужно будет выбрать соответствующий уровень кэширования и внедрить его в свое приложение (см. Ссылки выше для примеров реализации).

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

  1. Надежный, но более сложный - создайте действие в вашем контроллере, которое истекает из кеша, и задачу задания cron, которая делает запрос на это действие. Я задал похожий вопрос, который обращается к этому «встроенному» запланированному заданию . В целях безопасности вы можете захотеть включить сгенерированный хеш или что-то подобное, чтобы кто-то не мог вручную истечь ваш кеш, перейдя в '/products/expire_cache'.

    class ProductsController < ApplicationController
      caches_action :index
    
      def index
        # implementation
      end
    
      def expire_cache
        if params[:verification_hash] == 'sa89sf8sfsfehiwaf89yfea98fh'
          expire_action :action => :index
        end
      end
    end
    
  2. Ненадежный, но более простой - просто истекает срок действия кэша в вашем действии с произвольным условным условием. В этой реализации предполагается, что будет достаточно трафика, чтобы регулярно посещать ваш сайт через 0, 15, 30 и 45 минут. Вы можете уменьшить этот интервал, чтобы гарантировать, что кэш будет перезагружен с более вероятным интервалом.

    class ProductsController < ApplicationController
      caches_action :index
    
      def index
        # implementation
        expire_action :action => :index if Time.now.min % 15 == 0
      end
    end
    
0 голосов
/ 21 января 2011

Вероятно, самый простой способ для кэширования в Rails - это использование Memcached с опцией :expires_in.

Вам, вероятно, понадобится VPS-сервер для его использования, который может быть дорогим для небольших сайтов.

Но вы можете хорошо кэшировать время, даже не используя memcached. Этот небольшой фрагмент SimpleCache творил чудеса для моих общих размещенных сайтов.

0 голосов
/ 17 января 2011

Я думаю, что есть два подхода к тому, что вы хотите достичь:

  1. Просто кэшируйте фрагменты и действия, чтобы при первом обращении к странице доступ к базе данных и загрузка страницы происходили нормально,но каждое последующее попадание происходит из кэшированной версии.Основным преимуществом этого подхода является то, что вам не нужно иметь дело с отложенными заданиями и отображением ваших страниц вне обычного потока вещей.
  2. Создайте отложенное задание, которое отображает вашу страницу или отдельные фрагменты, которые получаюткэшируются.Во время рендеринга в отложенном задании фрагменты страницы будут фактически кэшироваться, как если бы пользователь их просматривал (при условии, что вы кешировали фрагмент и действие нормально).Как только отложенное задание выполнено, заполните столбец в вашей базе данных, который указывает, что эта запись / страница готова для просмотра.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...