Истечение срока действия асинхронного кэша с рельсами - PullRequest
5 голосов
/ 24 апреля 2011

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

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

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

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

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

1 Ответ

3 голосов
/ 21 августа 2011

Вам нужно будет вручную истечь срок действия кэша.Поскольку вы используете 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
...