Срок действия кеша 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