Rails片段缓存:100K +片段会降低性能吗?

Hop*_*eam 6 caching ruby-on-rails fragment-caching ruby-on-rails-3 ruby-on-rails-4

我有一个包含大量数据的网站,我正在所有页面上进行"俄罗斯玩偶"缓存,如下所示:

# 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的开箱即用的基于标准文件的实现.

Jaa*_*ans 1

在某些时候,您必须问自己这样一个问题:缓存命中是否仍比生成片段的成本更低。如果答案是肯定的(并且可以进行基准测试),与未缓存的情况相比,这仍然可以提高性能。不过,如果物理(盘片)硬盘驱动器上存储了数十万个缓存片段,我会非常警惕 I/O 瓶颈。如果这成为一个问题,您可以限制缓存策略的深度以减少文件数量。但再次,请进行基准测试。命中率在这里是一个非常重要的统计数据,因为在这种特定情况下,高命中率会限制 I/O。

如果性能让您担心,还请查看片段过期的频率。在您的具体情况下,每次发表评论时,“文章列表”都会变得无效。当前每 15 分钟就会过期,但如果您希望输出保持一致,实际上应该在发表或编辑评论或文章后立即过期。如果您的文章列表中每分钟有多个评论,那么您甚至可以在此处缓存单个评论,这绝对是正确的。如果 I/O 成为问题,您可以随时添加一些 RAM 并开始使用 memcached(或 redis)。

但是,因为您有多层缓存,所以除了对父“文章列表”片段的命中之外,您可能完全没问题,只需对文件系统进行几次命中即可。