在 Web 应用程序中为呈现的内容生成缓存键时,您必须考虑所有可能改变结果的变量。
在像 rails 这样的动态环境中,这些可以在不同的地方定义:控制器、模型、会话或服务器环境。它们可以在模板中、在模板中呈现的模板或助手中引用。你能想出一种方法来自动生成有助于渲染模板内容的变量列表,也许使用ParseTree?
odo
问问题
180 次
1 回答
0
我在我的缓存键中使用了一个“新鲜度键”,可能是从这篇文章中学到的:http: //blog.leetsoft.com/2007/5/22/the-secret-to-memcached
这使我可以轻松地使与资源相关的所有缓存无效,而不管 url,尽管事实上 memcached 不提供用于迭代现有键的工具。
我通常使用 request.url 和登录的用户 id 和 freshness_key 的组合来生成我的,例如
#
# 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
我将在控制器中使用它:
@posts_cache_key = cache_key_for(:posts)
@posts = cache(@posts_cache_key) do
Post.paginate(
:page => params[:page],
:per_page => params[:pp]
)
end
...在视图中:
<% cache(:key => "#{@posts_cache_key}:posts_list_fragment") do -%>
... html here ...
<% end -%>
通常我会有一个收集模型的观察者:
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
希望这可以帮助
于 2011-02-09T02:49:20.750 回答