Кеширование в Ruby Gem, возможно, без использования Rails - PullRequest
0 голосов
/ 13 мая 2010

Я переписываю существующий Ruby Gem, чтобы включить кеширование. Это для драгоценного камня, который относительно часто используется и обращается к большому количеству статических данных в веб-сервисе. В настоящее время у меня есть небольшое количество пользователей гемов, делающих большое количество обращений к сервису, которое при нормальных условиях будет забивать / закрывать сервис , и мы собираемся поставить гем на github для общее потребление.

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

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

Спасибо за ваши предложения

1 Ответ

1 голос
/ 16 марта 2011

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

Я решил определить API как «Провайдер», а затем «API», который определяет, какие методы требуются для любого провайдера. Так выглядят провайдер и API "Rails.cache".

Cachecataz.provider = Rails.cache
Cachecataz.api = {:get => :read, :set => :write, :incr => :increment, :exist? => :exist?}

Это действительно простой способ заставить кого-то выбрать Объект, который отвечает на необходимые методы создателя драгоценного камня. Каждое значение в хеше API может быть символом или объектом, который отвечает на вызов: (например, Proc или лямбда). Затем я просто использую свое внутреннее представление в своем геме (: get,: set,: incr,: exist?) И ищу объект / метод, который необходимо вызвать для его выполнения во время выполнения:

def make_api_call(method, *args)
  if Cachecataz.api[method].respond_to?(:call)
    Cachecataz.api[method].call(*args)
  else
    Cachecataz.provider.send(Cachecataz.api[method], *args)
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...