Истечение срока действия асинхронного кеша с помощью rails

Мое приложение использует «обычную» очистку кеша (подкласс ActionController::Caching::Sweeper) для истечения срока действия кеша (по существу фрагментов).

Теперь истечение срока действия кэша блокирует приложение на несколько секунд, что отрицательно сказывается на производительности с точки зрения пользователя.

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

К сожалению, простое добавление handle_asynchronously к функции истечения срока действия кеша в очистителе, похоже, не работает.

Можно ли асинхронно истечь фрагменты кеша с помощью delayed_job? Если да, то каковы наилучшие методы для этого?


person Topo    schedule 24.04.2011    source источник
comment
Какой кеш-сервер вы используете?   -  person Vlad Zloteanu    schedule 25.04.2011
comment
Привет, Влад, сейчас я использую Memcached.   -  person Topo    schedule 25.04.2011


Ответы (1)


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

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

Вот пример подметальной машины для Resque:

class UserMemcachedSweeper < ActionController::Caching::Sweeper
  observe User

  def after_save(user)
    Resque.enqueue UserCacheExpiry, user.id
  end
end

class UserCacheExpiry
  @queue = :cache_expiry

  def self.perform(user_id)
    Rails.cache.delete("/users/#{user_id}")
  end
end
person Winfield    schedule 21.08.2011