Срок действия кеша Rails

У меня есть приложение rails, в котором я использую простой кеш-рельсы. Мое тестирование выглядит следующим образом:

Rails.cache.write('temp',Date.today,:expires_in => 60.seconds)

Я могу прочитать его через Rails.cache.read('temp') и Rails.cache.fetch('temp').

Проблема в том, что она не истекает. Он будет продолжать жить через 60 секунд. Может ли кто-нибудь сказать мне, что здесь отсутствует.

FYI: Я заявил в своем развитии .rb следующим образом:

config.action_controller.perform_caching = true

config.cache_store = :memory_store

Есть ли что-то, что я пропустил? Я хочу закончить свой кеш.

Ответ 1

После некоторого поиска я нашел одну возможную причину, по которой кеш не очищается через 60 секунд.

  • Вы вызываете Rails.cache.write, который документирован здесь.
  • Он вызывает write_entry(namespaced_key(name, options), entry, options), где ваша опция :expires_in является частью аргумента options.
  • Реализация write_entry имеет следующее условие:

    if expires_in > 0 && !options[:raw]
        # Set the memcache expire a few minutes in the future to support race condition ttls on read
        expires_in += 5.minutes
    end
    

Итак, на ваши 60 секунд добавлено 5 минут. 2 возможных решения:

  • Просто жить с ним: -)
  • Попробуйте включить опцию :raw => true, возможно, это пропустит условие, так что ваше истечение будет работать как подозреваемое.

Ответ 2

Параметр :expires_in работает только с совместимыми хранилищами (например, memcached) - без памяти.

Из http://guides.rubyonrails.org/caching_with_rails.html:

Наконец, если вы используете memcached или Ehcache, вы также можете пройти:истекает. Фактически, все параметры, не используемые caches_action, отправляется в хранилище кэша.

Ответ 3

Вы должны использовать метод fetch с блоком do вместо Rails.cache.write. Даже если имя "fetch", оно записывается в кеш, если вы помещаете внутрь блока do. Вам также не нужно очищать запись кэша вручную, просто используйте "fetch" с expires_in и race_condition_ttl. Храните значение ttl в течение срока годности и сохраняйте его как можно меньшим.

output_json = Rails.cache.fetch('temp',expires_in: 1.minute,race_condition_ttl:3) do
  my_expansive_operation().to_json
end