Beim Generieren von Cache-Schlüsseln für gerenderten Inhalt in Webanwendungen müssen Sie alle Variablen berücksichtigen, die das Ergebnis ändern könnten.
In dynamischen Umgebungen wie Schienen können diese an verschiedenen Stellen definiert werden: der Controller, ein Modell, die Sitzung oder die Serverumgebung. Und sie können in der Vorlage, in einer in der Vorlage gerenderten Vorlage oder in einem Helfer referenziert werden. Können Sie sich eine Möglichkeit vorstellen, automatisch eine Liste von Variablen zu erstellen, die zum Inhalt der gerenderten Vorlage beitragen, möglicherweise unter Verwendung von ParseTree?Kann man die Komponenten eines Cache-Keys automatisch in Rails ableiten?
2
A
Antwort
0
Ich benutze einen „Frischen Schlüssel“ in meinem Cache-Keys, wahrscheinlich aus diesem Artikel gelernt: http://blog.leetsoft.com/2007/5/22/the-secret-to-memcached
Dies ermöglicht es mich einfach alle Cache auf eine Ressource, unabhängig von der URL, trotz der Tatsache zu entkräften, dass memcached bietet keine Möglichkeit, vorhandene Schlüssel zu wiederholen.
Normalerweise erzeuge ich meins, indem ich eine Kombination aus request.url und der angemeldeten Benutzer-ID und dem Frische-Schlüssel verwende, z.
#
# return the freshness_key for caching this particular collection
def get_freshness_key_for(collection_name)
Rails.cache.fetch("#{self.id}:#{collection_name}") { "#{self.send(collection_name).maximum(:updated_at).to_i}:#{Time.now.to_i}" }
end
#
# set the freshness_key for caching this particular collection;
# typically called after_save from an Observer for this collection
#
def set_freshness_key_for(collection_name)
Rails.cache.write("#{self.id}:#{collection_name}", "#{self.send(collection_name).maximum(:updated_at).to_i}:#{Time.now.to_i}")
end
# returns the cache_key for this client, the desired collection, and the
# current url with the latest freshness_key
#
# the url is hashed so as not to overrun memcached's key length limit
def cache_key_for(collection_name, request_url)
freshness_key = self.get_freshness_key_for(collection_name)
"#{self.id}:#{Digest::MD5.hexdigest(request_url)}:#{freshness_key}"
end
Ich werde es in einem Controller verwenden:
@posts_cache_key = cache_key_for(:posts)
@posts = cache(@posts_cache_key) do
Post.paginate(
:page => params[:page],
:per_page => params[:pp]
)
end
... und in der Ansicht:
<% cache(:key => "#{@posts_cache_key}:posts_list_fragment") do -%>
... html here ...
<% end -%>
Normalerweise werde ich einen Beobachter für die Sammlung Modell
class PostObserver < ActiveRecord::Observer
def after_save(post)
post.client.set_freshness_key_for(:posts)
end
def after_destroy(post)
post.client.set_freshness_key_for(:posts)
end
end
Hoffe das hilft