Работая вокруг нехватки срока действия подстановочного знака Мемкачена в хэшировании фрагмента рельсов

StackOverflow https://stackoverflow.com/questions/4013763

Вопрос

Я работаю над добавлением хэширования фрагмента на рельсы 3 сайта, который входил в систему, так и анонимные пользователи, и необходимо контролировать, когда часты страницы истекают на основе, когда содержимое отображается по всему сайту, обновляется. На полпути, я обнаружил, что MeMCached не поддерживает Regexps для Expire_Fragment, поэтому теперь я ищу об этом.

Для анонимных пользователей это не огромная проблема. Я создаю клавиши кэша, как «FrontPage-New-Show» или «График-недельный прогноз - 10 / 24/10» и истекает их, когда создана новая запись в модели Show, или когда появится Air Show в течение следующей недели изменяется через подметал. Это работает просто хорошо.

Моя проблема с пользователем, которые вошли в систему. У них есть собственный индивидуальный график, поэтому мои ключи похожи на «расписание-пользователя-jschuur-10/10/24» с JSCHUUR, являющимся именем пользователя на счет. Я понимаю, что с конвенцией на основании даты они истекают естественным образом, но я также хочу явно истекать все фрагменты для кэшированных графиков в течение дня, когда показать связанные изменения, происходят для чего-либо в вашем расписании на этот день (или неделя).

Как оказывается, memcached не может сделать срок действия подстановки, который мне нужен здесь (расписание-пользователя -. * - 10/10/24). Это означает, что мне нужно какое-то решение, которое хранит все ключи, выпущенные в центральном клавише поиска в Memcached, или есть ли рельсы / Ruby как-то, находящиеся на основе этого, на основе ключей, которые я отправил в Memcached для меня.

Я предполагаю, что первый - лучшее решение. Мой вопрос, как я могу сделать это наиболее эффективным способом, поэтому я не взорнул все время, не ударяющуюся в БД больше. Я мог бы просто сохранить массив или хеш в мемкачене, извлеките все это, цикл, если для матчей удалите их и сохраните обратно Hash. Это звучит так, будто он может отлично работать для нескольких сотен или даже тысячи пользователей, но это действительно лучший способ пойти?

Кто-то уже решал эту проблему и выпустил решение?

Одним из них следует полагать, что почти все мои кэширования в настоящее время сделаны с заявлениями в поле зрения, ориентированные на подготовленные запросы к активациям, которые еще не уволили, как этот:

<% if current_user %>
  <% if current_user.saved_shows_count %>
    <% cache "schedule-user-#{current_user.username}-#{(Time.now + 3.hours).to_date.end_of_week.strftime('%D')}" do %>
      <% if @shows.any? %>
        <%= render :partial => "schedule/schedule", :locals => { :shows => @shows } %>
      <% end %>
    <% end %>
...

Сайт размещен на Heroku, и я использую Gem Dalli в качестве клиента.

Это было полезно?

Решение

РЕДАКТИРОВАТЬ: Есть несколько вопросов с этим, как написано с GEM DALLI, делать чтение поднимает «маршал данные слишком короткие» или «неверные маршаллированные данные в мемкаче» для меня. Не уверен, будет ли это для вас.

Хотя немного взлома, вы можете использовать пространство имен, а затем увеличить пространство имен, что приведет к недействию всех ключевых клавиш, созданных его. Для этого сначала установите пространство имен в инициализатор (или где угодно) с Rails.cache.write("frontpage-new-shows-namespace", "1", {:raw => true}). Отказ Когда вы устанавливаете каждый кеш, добавьте Rails.cache.read("frontpage-new-shows-namespace") в хэш-ключ, куда бы вы ни хотели (это не имеет значения, где). Срок действия всех кэш-ключей, созданных в пространстве имен, так же просто, как Rails.cache.increment("frontpage-new-shows-namespace", 1). Отказ Вы можете добавить Rails.cache.read("frontpage-new-shows-namespace") В качестве глобальной переменной, устраняя поиск мемквач для создания ключей кэша, а затем обновлять эту переменную, когда вы выполняете приращение пространства имен кеша.

Удачи, и я надеюсь, что это помогает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top