многоуровневое кэширование с Ruby on Rails 3

#ruby-on-rails #ruby-on-rails-3 #caching #memcached

#ruby-on-rails #ruby-on-rails-3 #кэширование #memcached

Вопрос:

Я искал этот вопрос во многих местах, но не нашел ответа. Согласно руководствам rails и подобным материалам о кэшировании, rails может использовать один из таких типов кэша: в памяти, файловом хранилище, memcached, пользовательских классах кэша и так далее.

Но что, если я хочу использовать два или три типа кэша в одном приложении, в зависимости от кэшируемого объекта?

Например (агрегатор новостей с высокой нагрузкой): у меня есть пара интерфейсных rails-серверов, пара серверов с разделенным MongoDB и один сервер для memcached. Что, если я хочу сделать

  1. кэширование в памяти для каждого узла во внешних интерфейсах для очень часто используемых крошечных коллекций (чтобы избежать задержек в сети при получении данных из memcached) для разделов новостей и данных поддержки

  2. memcached для самых читаемых последних новостей

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

Ответ №1:

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

Ответ №2:

Я искал то же самое. ‘level2’ может быть тем, что вы ищете. Репозиторий: https://github.com/mezis/level2 Запись Rubygems: https://rubygems.org/gems/level2/versions/0.2.5 Огромная проблема заключается в том, что это не работает с dalli, обычным способом взаимодействия с memcached: https://github.com/mezis/level2/issues/6

Я также нашел layercake, но он кажется заброшенным: https://github.com/phaza/layercake

Я действительно хотел бы, чтобы у Rails была такая вещь, это похоже на общее желание.

Я подумываю о том, чтобы самому написать что-то подобное или, по крайней мере, создать отдельный помощник для локального кэша памяти, а затем использовать «обычную» систему кэша Rails для «обычных» вызовов кэша, как часть решения этой проблемы:https://github.com/coreinfrastructure/best-practices-badge/issues/1481