Направляющие, кэширующие запросы DB и лучшие практики

24
задан PlankTon 22 November 2011 в 02:11
поделиться

3 ответа

Относительно кэширования, нескольких деталей:

стоит использовать наклонную черту для разделения типа объекта и идентификатора, который является соглашением направляющих. Еще лучше модели ActiveRecord обеспечивают cacke_key метод экземпляра, который обеспечит уникальный идентификатор имени таблицы и идентификатора, "города/13" и т.д.

Одно незначительное исправление к Вашему фильтру after_save. Так как у Вас есть данные под рукой, Вы могли бы также записать их обратно к кэшу в противоположность, удаляют его. Это сохраняет Вас единственное прохождение в базу данных;)

def after_save
  Rails.cache.write(cache_key,self)
end

относительно корня вопроса при непрерывном получении по запросу @user.city.name существует два реальных варианта:

  • Денормализовывают название города пользователя к пользовательской строке. @user.city_name (сохраняют city_id внешний ключ). Это значение должно быть записано в в, экономят время.

- или

  • Реализация Ваш метод User.fetch к нетерпеливой загрузке город. Только сделайте это, если содержание городской строки никогда не изменяет (т.е. называет и т.д.), иначе можно потенциально открыть кучу проблем относительно аннулирования кэша.

Личное мнение: Реализуйте основные основанные на идентификаторе методы выборки (или используйте плагин) интегрироваться с memcached и денормализовывать название города к строке пользователя.

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

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

23
ответ дан Michael 29 November 2019 в 00:18
поделиться

Я шел бы вперед и смотрел бы на Memoization, который находится теперь в направляющих 2.2.

"Memoization является шаблоном инициализации метода однажды и затем прятание его значение для повторного использования".

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

Быстрый пример кода от Railscast:

class Product < ActiveRecord::Base
  extend ActiveSupport::Memoizable

  belongs_to :category

  def filesize(num = 1)
    # some expensive operation
    sleep 2
    12345789 * num
  end
  memoize :filesize
end

[еще 113] на Memoization

0
ответ дан mwilliams 29 November 2019 в 00:18
поделиться

Выезд cached_model

-1
ответ дан Bill 29 November 2019 в 00:18
поделиться
Другие вопросы по тегам:

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