Кеширование Rails, продолжайте хранить просроченное значение - PullRequest
5 голосов
/ 24 ноября 2011

У меня длинный запрос к базе данных в одной из наших систем сводных панелей, который я хотел бы кэшировать, поскольку результаты не должны быть точными в реальном времени, но могут дать «достаточно близкое» значение из кэша.Я хотел бы сделать это без необходимости когда-либо ждать пользователя.Я пытался использовать что-то вроде

Rails.cache.write('my_val', 'val', :expires_in => 60.minutes)

для хранения этого значения, но я не верю, что оно дает именно ту функциональность, которая мне нужна.Я хотел бы позвонить с

 Rails.fetch('my_val') { create a background task to update my_val; return expired my_val}

Кажется, что my_val удаляется из кэша, когда он истек, хотя.Есть ли способ получить доступ к значению с истекшим сроком действия или к другому встроенному механизму, который бы включил эту функцию?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Просто сделайте это:

Rails.cache.write('my_val', 'val')

никогда не истекает

Теперь запустите фоновое задание:

SomeLongJob.process

В задании SomeLongJob.process сделайте следующее:

def SomeLongJob.process
  some_long_calculation = Blah.calc
  Rails.cache.write('my_val', some_long_calculation)
end

Теперь прочитайте данные с помощью

def get_value
  val = Rails.cache.read('my_val', 'val')
end
1 голос
/ 12 ноября 2012

Опция :race_condition_ttl для Rails.cache.fetch ДЕЙСТВИТЕЛЬНО близка к тому, что вы ищете: http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch

Но, насколько я могу судить, первый запрос все еще заблокирован (это только последующие, которыеполучить старое значение во время его обновления).Не уверен, почему они не прошли весь путь с этим.Было бы лучше, если бы упомянутый шаблон @drhenner был абстрагирован в такую ​​опцию, но я еще не видел ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...