Кеш Rails истекает - PullRequest
       0

Кеш Rails истекает

10 голосов
/ 13 января 2012

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

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

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

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

К вашему сведению: я объявил в своем файле development.rb следующее:

config.action_controller.perform_caching = true

config.cache_store = :memory_store

Есть что-то, что я пропустил?Я хочу, чтобы истек срок действия моего кэша.

Ответы [ 3 ]

11 голосов
/ 13 января 2012

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

  1. Вы звоните Rails.cache.write, что задокументировано здесь .
  2. Он вызывает write_entry(namespaced_key(name, options), entry, options), где ваш параметр :expires_in является одной частью аргумента options.
  3. Реализация 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, возможно, при этом условие будет пропущено, и ваш срок действия будет соответствовать предполагаемому.
5 голосов
/ 12 февраля 2013

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

С http://guides.rubyonrails.org/caching_with_rails.html:

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

0 голосов
/ 20 июня 2019

Вы должны использовать метод 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...