rails 3 настройки сайта кеширования с возможностью перезагрузки кеша без перезапуска сервера и сторонних инструментов - PullRequest
0 голосов
/ 13 февраля 2011

Мне нужно какое-то решение, чтобы сделать следующие функциональные возможности на моем сайте RoR 3:

Сайт нуждается в системе оценки пользователей, в которой пользователи получают баллы за выполнение некоторых действий (например, получение баллов за ответы на вопросы по стеку).

Проблемы:

1) Мне нужна возможность перераспределять количество баллов за некоторые действия (не так часто, но я не могу перезапускать Mongrel каждый раз, когда мне нужно переназначить, поэтому константы в коде и YAML не подходят )

2) Я не могу использовать простую Active Record, потому что на 5000 пользователей я буду делать слишком много запросов для каждого пользовательского действия, поэтому мне нужно кэширование и возможность сбрасывать кэш при переназначении

3) Я хотел бы сделать это без memcached или чего-то подобного, потому что мое серверное оборудование достаточно старое.

Кто-нибудь знает такое решение?

Ответы [ 2 ]

1 голос
/ 13 февраля 2011

Как насчет этого?

@@points_loaded = false
@@points

def load_action_points 
    if (File.ctime("setting.yml")  < Time.now) || !@@points_loaded
        @@points = YAML::load( File.open( 'setting.yml' ) )
        @@points_loaded = true 
    else
        @@points
end 

или используйте A :: B и кэшируйте поиск в БД

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


  def points
   self.all
  end

  memoize :points
end

Вы также кешируете точки в модели User, что-то вроде этого ... псевдокод ...

class User < A::B

  serialize :points


def after_save
points = PointCalculator(self).points
end 

end 

и ....

  class PointCalculator

        def initialize(user)
        @@total_points = 0
          user.actions.each do |action|
             p = action.times * ActionPoints.find_by_action("did_something_cool").points
@@total_points = @@total_points + p 
          end 

        end

    def points
     @@total_points
    end

      end 
0 голосов
/ 13 февраля 2011

Я нашел простое решение, но оно работает, только если у вас есть один экземпляр сервера RoR:

class Point < ActiveRecord::Base
  @@cache = {}

  validates :name, :presence => true
  validates :amount, :numericality => true, :presence => true

  after_save :load_to_cache, :revaluate_users

  def self.get_for(str)
    @@cache = Hash[Point.all.map { |point| [point.name.to_sym, point] }] if @@cache == {} #for cache initializing
    @@cache[str.to_sym].amount
  end

  private

  def load_to_cache
    @@cache[self.name.to_sym] = self
  end

  def revaluate_users
   #schedule some background method, that will update all users' scores
  end
end

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

...