Как мне кэшировать метод с помощью Ruby / Rails?

У меня дорогой (трудоемкий) внешний запрос к другому веб-сервису, который мне нужно сделать, и я бы хотел его кешировать. Поэтому я попытался использовать эту идиому , поместив в контроллер приложения следующее:

def get_listings
  cache(:get_listings!)
end

def get_listings!
  return Hpricot.XML(open(xml_feed))
end

Когда я вызываю get_listings! в моем контроллере, все круто, но когда я вызываю ] get_listings Rails жалуется, что не было дано ни одного блока. И когда я смотрю на этот метод, я вижу, что он действительно ожидает блок, и, кроме того, похоже, что этот метод предназначен только для использования в представлениях? Так что я предполагаю, что, хотя не было указано, что это просто псевдокод.

Итак, мой вопрос, как мне кэшировать что-то подобное? Я пробовал различные другие способы, но не мог понять это. Спасибо!

11
задан Andrew Grimm 17 March 2011 в 03:09
поделиться

2 ответа

Как предполагает nruth, встроенное хранилище кеша Rails, вероятно, то, что вам нужно.

Попробуйте:

def get_listings
  Rails.cache.fetch(:listings) { get_listings! }
end

def get_listings!
  Hpricot.XML(open(xml_feed))
end

fetch() извлекает кэшированное значение для указанного ключа или записывает результат блока в кэш, если он не существует.

По умолчанию кеш Rails использует хранилище файлов, но в рабочей среде предпочтительным вариантом является memcached.

См. раздел 2 http://guides.rubyonrails.org/caching_with_rails.html для более подробной информации.

9
ответ дан 3 December 2019 в 03:16
поделиться

подход в коде может выглядеть примерно так:

def get_listings
  @listings ||= get_listings!
end

def get_listings!
  Hpricot.XML(open(xml_feed))
end

который будет кэшировать результат для каждого запроса (новый экземпляр контроллера для каждого запроса), хотя вы можете посмотреть на помощники «memoize» в качестве опции API.

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

«Способ Rails» кэшировать запросы — это хранилище Rails.cache. Memcached часто используется, но вы можете обнаружить, что хранилища файлов или памяти соответствуют вашим потребностям. Это действительно зависит от того, как вы развертываете и хотите ли вы расставить приоритеты в кэше, времени отклика, хранилище (ОЗУ) или использовать размещенное решение, например. аддон хероку.

14
ответ дан 3 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: