2008-11-18 4 views
1

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

Мое первое приложение немного отличается от традиционного: на одном из моих классов моделей у меня есть части данных, которые извлекаются из базы данных и другой части, которые получены путем выполнения запроса HTTP REST внешнему ресурсу.

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

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

Как я могу реализовать его и какой будет компромисс памяти для хранения этих кешей? Было бы целесообразно хранить эти данные на сеансе или на отдельной структуре на сервере? Должен ли я рассматривать одну из таких внешних систем кэширования, как GigaSpaces и т. Д.??

Заранее благодарим за любые советы, которые вы можете предложить по этой проблеме.

ответ

1

я рекомендовал бы один из двух стратегий:

  1. Использование memcached, с открытым исходным кодом кэширования демон. Библиотеки клиентов доступны для нескольких популярных языков и поддерживают такие функции, как запланированное недействительность кэшированных данных и т. Д.
  2. Включите в свою базу данных некоторые поля в базе данных для хранения кэшированных данных вместе с полем «cache_last_updated», которое обновляется каждый раз, когда вы сохраняете запись. Затем, извлекая запись из базы данных, если значение этого поля составляет более 5 минут, вы можете повторно кэшировать данные из RESTful API (вы не используете CouchDB, не так ли?) И сохраните это в базе данных, обновление последней обновленной временной метки, а затем возврат этих данных пользователю.

Я бы порекомендовал первый, потому что, откровенно говоря, в противном случае вы будете делать несколько чтений и записи в базу данных по запросу, что приведет к значительной стоимости исполнения.

Кроме того, этот вопрос может применяться к вещам, отличным от Ruby on Rails, - многие сценарии предполагают кэширование из какого-то внешнего источника.

Смежные вопросы