2012-01-13 5 views
8

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

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

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

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

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

config.action_controller.perform_caching = true 

config.cache_store = :memory_store 

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

ответ

9

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

  1. Вы звоните Rails.cache.write, который задокументирован here.
  2. Он вызывает write_entry(namespaced_key(name, options), entry, options), где ваш вариант :expires_in является частью аргумента options.
  3. implementation of 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 
    

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

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

Спасибо за ваш повтор .... дай мне попробовать, и пусть вы знаете – palani

+0

Да mliebelt права, а также хороший документ рельсы кэша вы можете найти здесь http://guides.rubyonrails.org/caching_with_rails.html –

5

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

От http://guides.rubyonrails.org/caching_with_rails.html:

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