Я внедряю кеширование в свой Rails-проект через Memcached и, в частности, пытаюсь кешировать боковые блоки столбцов (самые последние фотографии, блоги и т. Д.), И в настоящее время у меня они истекают из кеша каждые 15 минут или около того. Это работает, но если я смогу сделать это более актуально, как всякий раз, когда новый контент добавляется, обновляется или еще что-то, это было бы лучше.
Я смотрел эпизод скринкастов Scaling Rails на Memcached http://content.newrelic.com/railslab/videos/08-ScalingRails-Memcached-fixed.mp4,, и в 8:27 на видео Грегг Поллак рассказывает об интеллектуальном кэшировании в Memcached таким образом, что интеллектуальные ключи (в этом примере updated_at timestamp) используются для замены ранее кэшированных элементов без истечения срока действия кэша. Таким образом, всякий раз, когда метка времени обновляется, кэш обновляется, поскольку ищет новую метку времени, я бы предположил.
Я использую боковой блок «Последние фотографии» для этого примера, и вот как он настроен ...
_side-column.html.erb:
<div id="photos"">
<p class="header">Photos</p>
<%= render :partial => 'shared/photos', :collection => @recent_photos %>
</div>
_photos.html.erb
<% cache(photos) do %>
<div class="row">
<%= image_tag photos.thumbnail.url(:thumb) %>
<h3><%= link_to photos.title, photos %></h3>
<p><%= photos.photos_count %> Photos</p>
</div>
</div>
<% end%>
При первом запуске Memcached кэширует блок как views / photos / 1-20110308040600 и перезагружает этот кэшированный фрагмент при обновлении страницы, пока что все хорошо. Затем я добавляю дополнительную фотографию к этой конкретной строке в бэкэнде и перезагружаю ее, но количество фотографий не обновляется. Журнал показывает, что он все еще загружается из views / photos / 1-20110308040600 и не получает обновленную метку времени. Все, что я делаю, похоже на то, что делает видео, что я делаю выше?
Кроме того, в этом вопросе есть вторая часть. Как вы видите в приведенном выше фрагменте, для коллекции вызывается запрос @recent_photos (из модуля в моей папке lib). Однако я заметил, что даже когда блок кэшируется, этот запрос SELECT все еще вызывается. Сначала я попытался обернуть весь фрагмент в блок как <% cache (@recent_photos) do%>, но, очевидно, это не сработало - тем более, что нет реальной отметки времени для всей коллекции, конечно, для отдельных элементов. , Как я могу предотвратить выполнение этого запроса, если результаты уже кэшированы?
UPDATE
Что касается второго вопроса, я обнаружил, что разве Rails.cache.exist? может быть, просто мой билет, но хитрость заключается в подстановочной природе использования метки времени ...
ОБНОВЛЕНИЕ 2
Не обращая внимания на мой первый вопрос, я выяснил, почему кеш не обновлялся. Это потому, что поле updated_at не обновлялось. Причиной этого является то, что я добавлял / удалял элемент, который является вложенным ресурсом в родительском объекте, и мне, вероятно, нужно реализовать «прикосновение» к нему, чтобы обновить поле updated_at в родительском элементе.
Но мой второй вопрос все еще остается в силе ... основной запрос @recent_photos все еще вызывается, даже если фрагмент кэшируется ... есть ли способ использовать cache.exists? настроить таргетинг на кеш с именем что-то вроде / views / photos / 1-2011random?