2 Stimmen

Page-Caching, bewährte Praxis bei automatischen Ablauf-/Sweepers

Ich habe mich bisher noch nicht wirklich mit den erstaunlichen Cache-Techniken von Rails befasst. Etwas, das ich wirklich nicht verstehen kann, ist, wie man ein bestimmtes Problem löst.

Angenommen, ich habe ein Blog-Modell mit vielen Posts:

class Blog < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  named_scope :published, :conditions => ["published_at < ?", Time.now]
end

Und die show-Aktion im BlogsController zeigt eine Liste von veröffentlichten Posts:

// BlogsController

def show
 @blog = Blog.find(params[:id)
end

// View

<% @blog.posts.published.each do |p| %>
 <%=h p.title %>
 <%= simple_format(p.content) %>
<% end %>

Der Cache muss verfallen, wenn Änderungen am Attribut published_at vorgenommen werden, ABER er muss auch verfallen, wenn published_at in die Zukunft gesetzt wird und die Zeit erreicht wird.

Könnt ihr mir ein paar Ideen und Hinweise geben, wie man dieses Problem am besten löst? Cron-Job oder verliere ich meinen Verstand?

5voto

Andy Stewart Punkte 4651

Der von Ihnen gezeigte Code verwendet keine der Caching-Funktionen von Rails. Allerdings wird Ihr :published benannter Bereich (und in der Produktion wird er durch das Klassencaching an Time.now erinnern), wenn dieser Code zum ersten Mal ausgeführt wird.

Ich vermute, Sie möchten stattdessen dies:

named_scope :published, lambda { { :conditions => ["published_at < ?", Time.now] } }

Das Lambda stellt sicher, dass Rails Ihre Bedingung jedes Mal neu auswertet.

1voto

jonnii Punkte 27657

Es kommt alles darauf an, welche Art von Datenspeicher Sie verwenden, um den Cache zu speichern.

Wenn Sie das Dateisystem verwenden, könnten Sie einen Cron-Job schreiben, um den Cache in bestimmten Abständen ungültig zu machen oder das Datum und die Uhrzeit, bis zu denen der Cache gültig ist, im Cache-Schlüssel codieren und dies bei jeder Anfrage überprüfen und bei Bedarf ungültig machen.

Alternativ, wenn Sie backend memcached verwenden, können Sie einen ablau fenden Cache verwenden, was wahrscheinlich die beste Lösung ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X