在研究了DHH和其他关于基于密钥的缓存过期和俄罗斯娃娃缓存的博客文章之后,我仍然不确定如何处理一种关系类型.具体来说,是一种has_many关系.
我将分享我对示例应用程序的研究结果.这是一个故事讲述,所以坚持下去.假设我们有以下ActiveRecord模型.我们所关心的只是模型的正确改变cache_key,对吗?
class Article < ActiveRecord::Base
attr_accessible :author_id, :body, :title
has_many :comments
belongs_to :author
end
class Comment < ActiveRecord::Base
attr_accessible :article_id, :author_id, :body
belongs_to :author
belongs_to :article, touch: true
end
class Author < ActiveRecord::Base
attr_accessible :name
has_many :articles
has_many :comments
end
Run Code Online (Sandbox Code Playgroud)
我们已经有一篇文章,只有一条评论.两者都是由不同的作者.目标是cache_key在以下情况下对文章进行更改:
因此,默认情况下,我们对案例1和案例2都有好处.
1.9.3-p194 :034 > article.cache_key
=> "articles/1-20130412185804"
1.9.3-p194 :035 > article.comments.first.update_attribute('body', 'First Post!')
1.9.3-p194 :038 > article.cache_key
=> "articles/1-20130412185913"
Run Code Online (Sandbox Code Playgroud)
但不是案例3.
1.9.3-p194 :040 > article.author.update_attribute('name', 'Adam A.')
1.9.3-p194 :041 …Run Code Online (Sandbox Code Playgroud) ruby caching ruby-on-rails fragment-caching russian-doll-caching
这是我的APC如何运行的链接:[已删除]
正如你所看到的,它很快就会填满,我的Cache Full Count有时会超过1000
我的网站使用Wordpress.
我注意到,每次我发布新帖子或编辑帖子时,都会发生两件事.
1)APC内存"USED"重置2)我得到了很多碎片
我试过给APC提供更多的内存(512 mb),但有时会崩溃,看来384是最好的.我还有一个Cron作业,每4小时重新启动一次apache,清除所有APC片段并使用内存.再说一次,如果APC运行了很长一段时间,我的apache会崩溃,我认为由于片段的堆积.
我应该使用apc.Filters并过滤掉一些不应该缓存的东西吗?
我真的很喜欢这种东西,所以如果有人可以用完整的说明解释,非常感谢你!
这个问题基于2篇文章:
- 来自37signals的DHH的Basecamp Next
- Adam Hawkins 在Rails中的高级缓存
我对使用俄罗斯娃娃缓存的性能影响有点困惑,具体来说:
使用自动过期密钥时,似乎每个请求都会导致访问数据库以获取对象时间戳 - 我错过了什么吗?(我知道在最好的情况下,你必须只为层次结构中的顶级键做到这一点,但仍然......)
在第1篇文章中,他们缓存了一个待办事项列表,以及每个待办事项.缓存列表非常有意义,因为它节省了大量工作(所有项目的数据库查询).但为什么要缓存单个项目?您已经访问数据库以获取Item时间戳,那么您究竟要保存什么?生成一些html行?
在第二篇文章中,Adam缓存了这样的视图块:
cache [post, 'main-content']...
cache [post, 'comments']
当添加注释时,它会更改帖子的时间戳,因此会使两个entires无效.但是,main-content没有改变 - 你不想再生它!如何才能使评论无效.(这实际上是一个非常常见的用户案例 - 一个具有一些逻辑上独立的部分的模型:对象本身,不同的关联,某些其他商店中的数据等)
对我来说,只有当你有一个深层次的嵌套对象时,俄罗斯玩偶缓存才有意义.(在basecamp中你有project-> todos list - > todo - > items list).但是,如果您的层次结构较浅,则最好自己进行无效.
对于任何反馈,我们都表示感谢!
谢谢.
在我看来,片段缓存和急切加载 - 至少有时 - 在某种程度上相互矛盾.假设我有一个用户,他有很多帖子,每个帖子都有很多评论,反过来也可以有很多评论等等.
当我必须渲染页面时,我可以选择热切地加载用户,所有帖子,所有评论等等,以避免数据库n-1次.或者我可以懒惰地加载每个对象并依赖片段缓存来仅查询数据库中的新对象或已更改的对象.使用片段缓存和急切加载似乎都是浪费,因为我可能会做一个非常复杂的查询并实例化很多对象只是为了使用它们中的一小部分.
但是,如果我有一个应用程序,其中一个用户有许多Foos,而这些Foos又有很多Bars等等,但是其中每个Foo都是同时创建完整的所有Bars及其相关对象,从那时起就永远不会改变.在这种情况下,我想对已经渲染的Foos使用片段缓存,但是当我必须加载一个带有所有相关对象的新Foo时,要使用预先加载.毕竟,在更细粒度的级别缓存片段没有任何好处.
Rails实现这一目标的最佳方式是什么?我想我可以做一个查询来获取Foo的id,然后在我必须渲染每个Foo时用急切加载进行显式查找.这样做有更好/更优雅/更惯用的方式吗?
performance caching ruby-on-rails fragment-caching eager-loading
我怎么能缓存整个页面,除了顶部的一点,"Welcome back, Matt! | Log Out"如果用户登录等等,那就说明了什么?
我正在使用ASP.NET MVC 2.
我有一个显示事件列表的模板
<tbody>
<%= render partial: 'event', collection: events, cached: true %>
</tbody>
Run Code Online (Sandbox Code Playgroud)
部分event:
<% cache event do %>
<tr>
<td>
Something
</td>
<td>
<%= render 'identifiable_link_with_tag', identifiable: event.identifiable %>
</td>
</tr>
<% end %>
Run Code Online (Sandbox Code Playgroud)
部分identifiable_link_with_tag:
<% cache identifiable do %>
<span class="badge badge-info"><%= identifiable.type %></span> <%= link_to identifiable.identifier, identifiable %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
现在,奇怪的是接下来的事情.有时我会在事件视图中注意到,对于某些事件,identifiable会呈现另一个partial()而不是identifiable_link_with_tag:_identifiable.这似乎很奇怪,在列出25个事件的页面上,这只会发生在1或2或3(或0)个事件中.
简而言之,似乎有时会出现错误的可识别.我确实使用Rails片段缓存,因此这可能是一个因素.我错过了什么或者我遇到过Rails错误吗?这个问题很难在开发中重现,因此难以调试.
ruby-on-rails fragment-caching ruby-on-rails-5 ruby-on-rails-5.1
我有一个包含大量数据的网站,我正在所有页面上进行"俄罗斯玩偶"缓存,如下所示:
# articles.html.haml
- cache "list of articles", expires_in: 15.minutes do
= render partial: "article", collection: @articles
# _article.html.haml
- cache article do
= article.body
= render partial: "comment", collection: article.comments
# _comment.html.haml
- cache comment do
= comment.body
Run Code Online (Sandbox Code Playgroud)
这将产生数十万个碎片.
1.这会降低/ tmp/cache目录中这么多片段文件的性能吗?
2.当自动过期时,rail会自动删除旧片段吗?
PS.该站点驻留在一个4GB内存的Ubuntu服务器上.它不是使用memcached作为缓存存储,而是使用带有rails的开箱即用的基于标准文件的实现.
caching ruby-on-rails fragment-caching ruby-on-rails-3 ruby-on-rails-4
我有一个页面,其控件是输出缓存(部分输出缓存).这些设置如下:
[PartialCaching(86400, null, null, "campaign.whatwhere", true)]
public partial class controls_LatestEnquiriesListCached : System.Web.UI.UserControl
{
...
Run Code Online (Sandbox Code Playgroud)
同
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "campaign.whatwhere")
{
return (CampaignManager.CurrentCampaign.DefaultWorkTypeId ?? 0).ToString() + (CampaignManager.CurrentCampaign.DefaultEnquiryAreaId ?? 0).ToString();
}
return base.GetVaryByCustomString(context, custom);
}
Run Code Online (Sandbox Code Playgroud)
在 Global.asax
如何设置以便我可以在特定页面上清除此输出缓存?
有可能设置像MyPageWithCachedControl.aspx?ClearCache=true???
我有一个呈现很多部分内容的页面。我将它们全部缓存起来,这使得速度非常快。天哪!
问题是,由于部分的数量,第一次运行,在写入缓存时,需要很长时间,请求超时(但其他时间真的很快)
我也使用 sidekiq (但问题与任何后台处理器相关)
有没有办法将这些部分保存在后台进程中,以便错过缓存(由于过期)的用户不会超时?所以我会检查所有部分,以及那些缓存过期(或即将过期)的部分,我将重新缓存它们?
caching ruby-on-rails fragment-caching background-process ruby-on-rails-4
我想预先构建一个需要几秒钟渲染的局部.我见过使用代理通过http预加载缓存的函数,但我希望有一个"内部"解决方案.
这是我的函数,每当myobject更新时都会调用它:
def pre_build_partial myobject
the_controller = ActionController::Base.new
the_controller.instance_variable_set '@myobject', myobject
view_renderer = ActionView::Renderer.new the_controller.lookup_context
view_renderer.render the_controller.view_context, { partial: 'mypartial', layout: false }
end
Run Code Online (Sandbox Code Playgroud)
它适用于使用基本帮助程序的部分,但我的自定义助手会抛出错误:
undefined method `my_custom_helper_function' for #<#<Class:...>
我想帮助者必须加入the_controller,但我找不到办法.在此先感谢您的帮助!
fragment-caching ×10
caching ×5
asp.net ×2
37-signals ×1
apc ×1
asp.net-mvc ×1
c# ×1
global-asax ×1
helpers ×1
opcode ×1
opcode-cache ×1
performance ×1
prebuild ×1
ruby ×1
wordpress ×1