2

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?

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