2

Lors de la génération de clés de cache pour le contenu rendu dans les applications Web, vous devez prendre en compte toutes les variables susceptibles de modifier le résultat.
Dans les environnements dynamiques comme les rails, ceux-ci peuvent être définis dans différents endroits: le contrôleur, un modèle, la session ou l'environnement du serveur. Et ils peuvent être référencés dans le modèle, dans un modèle rendu dans le modèle ou un assistant. Pouvez-vous imaginer un moyen de générer automatiquement une liste de variables qui contribuent au contenu du modèle rendu, peut-être en utilisant ParseTree?Est-il possible de dériver automatiquement les composants d'une clé cache dans des rails?

Répondre

0

J'utilise une « clé de fraîcheur » dans mes clés du cache, sans doute appris de cet article: http://blog.leetsoft.com/2007/5/22/the-secret-to-memcached

Cela me permet d'annuler facilement tout cache lié à une ressource, quelle que soit l'URL, malgré le fait que memcached ne fournit pas de fonction pour l'itération des clés existantes.

Je génère généralement le mien en utilisant une combinaison de request.url et de l'identifiant utilisateur connecté et de la touche freshness, par ex.

# 
# 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 

Je vais l'utiliser dans un contrôleur:

@posts_cache_key = cache_key_for(:posts) 

@posts = cache(@posts_cache_key) do 
    Post.paginate(
    :page => params[:page], 
    :per_page => params[:pp] 
) 
end 

... et dans la vue:

<% cache(:key => "#{@posts_cache_key}:posts_list_fragment") do -%> 
    ... html here ... 
<% end -%> 

En général, je vais avoir un observateur pour le modèle de collection:

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 

Espérons que cela aide

Questions connexes