Frage

Ich arbeite an Hinzufügen von Fragment-Caching auf eine Rails 3 Website, die sowohl innerhalb als auch anonyme Benutzer angemeldet hat, und Notwendigkeit, Kontrolle, wenn Teile der Seite expire basierend auf, wenn Inhalte angezeigt gesamte Website aktualisiert wird. Midway in diesem, entdeckte ich, dass Memcached nicht regexps für expire_fragment nicht unterstützt, so dass nun nach Möglichkeiten, um das ich suche.

Für anonyme Benutzer ist dies kein großes Problem. Ich schaffe Cache Tasten wie ‚Frontpage-new-Shows‘ oder ‚Zeitplan-weekly-Prognose-10/24/10‘ und sie endet, wenn ein neuer Eintrag im Show-Modell gemacht wird, oder wenn eine Show, dass Airs innerhalb der nächsten Woche wird über Kehrmaschinen modifiziert. Das funktioniert ganz gut.

Mein Problem ist mit Benutzer, die angemeldet sind. Sie haben jeweils ihren eigenen individuellen Zeitplan haben, so mein Schlüssel aussehen wie ‚Zeitplan-user-jschuur-10/10/24‘ mit jschuur der Benutzername auf das Konto sein. Ich verstehe, dass mit dem Datum basiert Konvention, sie natürlich ablaufen, aber ich möchte auch alle Fragmente für Cache-Zeitpläne während des Tages explizit ablaufen, wenn zeigen damit verbundenen Änderungen für etwas in Ihren Zeitplan auftreten für diesen Tag (oder Woche).

Wie sich herausstellt, Memcached kann die Art der Wildcard-Ablauf nicht tun, was ich brauche hier (Zeitplan-Benutzer -. * - 10/10/24). Dies bedeutet, dass ich eine Art von Lösung, dass speichert alle Schlüssel in einem zentralen Lookup-Schlüssel ausgestellt in memcached oder habe Rails / Ruby-irgendwie dies die Schlüssel intern tun, basierend auf mich Memcached für mich gesandt habe.

ich den ehemaligen gehe davon ist die bessere Lösung. Meine Frage ist, wie kann ich tun dies auf die effizienteste Art und Weise, so dass ich alle nicht blasen die Zeit der DB nicht mehr gespeicherten schlagen. Ich konnte nur speichern ein Array oder Hash in Memcached, rufen Sie die ganze Sache, eine Schleife über, wenn für die Spiele, entfernen Sie diese und speichern Sie die Hash zurück. Das klingt wie könnte es für ein paar hundert oder sogar tausend Anwender große Arbeit, aber das ist wirklich der beste Weg zu gehen?

Hat jemand dieses Problem bereits in Angriff genommen und eine Lösung veröffentlicht?

Eine Sache zu prüfen ist, dass fast alle meine Caching zur Zeit mit Aussagen in der Ansicht durchgeführt wird, richtet sich an ActiveRelations Anfragen vorbereitet, die noch nicht gefeuert haben, wie diese:

<% 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 %>
...

Die Seite ist auf Heroku gehostet und ich bin mit dem dalli gem als Client.

War es hilfreich?

Lösung

EDIT: Es gibt einige Probleme mit diesem als mit dem dalli Juwel geschrieben, eine Lese tun wirft „Marschall Daten zu kurz“ oder „ungültig Marshalled Daten in memcache“ für mich. Nicht sicher, ob es wird auch für Sie.

Obwohl es ein wenig hackish, könnten Sie einen Namespace verwenden und dann den Namensraum erhöhen, damit alle Schlüssel ungültig zu machen erstellt es zu benutzen. Dazu stellen Sie zuerst den Namespace in einem Initialisierer (oder wo auch immer) mit Rails.cache.write("frontpage-new-shows-namespace", "1", {:raw => true}). Wenn Sie jeden Cache festzulegen, fügen Rails.cache.read("frontpage-new-shows-namespace") in die Raute-Taste, wo immer Sie möchten (es ist nicht Minster wo). Auslaufende all Cache-Schlüssel in einem Namensraum ist so einfach wie Rails.cache.increment("frontpage-new-shows-namespace", 1). Möglicherweise können Rails.cache.read("frontpage-new-shows-namespace") als globalen Variable hinzuzufügen, memcache sucht für die Erstellung von Cache-Keys zu beseitigen, und dann diese Variable aktualisieren, wenn Sie ein Cache-Namensraum Schritt tun.

Viel Glück, und ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top