Кэширование с переменной экземпляра в ruby ​​с возможностью expired_after - PullRequest
1 голос
/ 07 февраля 2012

Я разрабатываю приложение ruby ​​(а не rails), я ищу очень простой способ кеширования некоторых часто используемых результатов.как например:

 @users ||= User.all

Теперь это работает отлично, но я ищу способ добавить что-то вроде опции expire , которая будет обновлять команду каждый период времени.Другими словами, мне нужно, чтобы одно и то же действие выполнялось в каждом интервале времени или через несколько раз.Я помню, что в rails я запускал memcached и использовал что-то вроде: expire или: expired_at.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Не думаете ли вы, что вышесказанное немного сложнее?

Я пытался что-то вроде:

Cache ={}
def fetch(key, ttl)
  obj, timestamp = Cache[key.to_sym]
  if obj.nil? || Time.now - timestamp > ttl
    obj = yield
    Cache[key]=[obj, now]
  end 
  obj
end

Я хотел бы услышать ваш комментарий об этом

1 голос
/ 07 февраля 2012

Как насчет чего-то вроде:

class Class
  # create a method whose return value will be cached for "cache_for" seconds
  def cached_method(method,cache_for,&body)
    define_method("__#{method}__".to_sym) do |*a,&b|
      body.call(*a,&b)
    end
    class_eval(<<METHOD)
      def #{method}(*a,&b)
        unless @#{method}_cache && (@#{method}_expiry > Time.now)
          @#{method}_cache  = __#{method}__(*a,&b)
          @#{method}_expiry = Time.now + #{cache_for}
        end
        @#{method}_cache
      end
METHOD
  end
end

Вы можете использовать его как:

class MyClass
  cached_method(:users,60) do
    User.all
  end
end

Это кеширует пользователей на 60 секунд. Если вы снова вызовете users для того же объекта через 60 или более секунд, он снова выполнит тело метода и обновит кеш.

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