问题标签 [russian-doll-caching]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
257 浏览

ruby-on-rails - 使用俄罗斯娃娃手动过期缓存

我有一个用户可以保存很多搜索和很多任务。我正在使用以下内容缓存它们

我添加了通过选项更新用户的touch选项,只要这些记录中的任何一个被更新。我想澄清的问题是这种情况:

我已经更新了一个搜索,它使该搜索的缓存过期,实际上是用户的缓存。由于用户的缓存已过期,user.tasks将被执行。

有没有办法防止这种情况?

我正在考虑添加一个密钥cache user并手动使我在使用cache_digestgem 之前一直在做的缓存过期,但我不知道该怎么做。

0 投票
1 回答
575 浏览

ruby-on-rails - 缓存包含动态内容的静态 html 的最佳方法是什么?

我在 Rails 中使用 haml 和俄罗斯娃娃缓存。我的目标是缓存尽可能多的静态 html,并且只呈现动态内容。但是,我经常有一大段未缓存的html,因为中间有一小部分动态代码。

假设我有这个包含 2 个部分的视图:

显示.html.haml

_container.html.haml

_dynamic.html.haml

我不能将_container部分包装在缓存块中,因为它包含动态内容。我知道我可以根据动态部分中的因变量来键入缓存块,但假设动态部分的复杂性太高而无法缓存。

解决这个问题的好方法是什么?

0 投票
2 回答
2648 浏览

ruby-on-rails - 使用 has_many 关系为俄罗斯娃娃缓存构建 Rails 应用程序

在研究了 DHH 和其他关于基于键的缓存过期和俄罗斯娃娃缓存的博客文章之后,我仍然不确定如何处理一种关系类型。具体来说,是一种has_many关系。

我将在示例应用程序上分享我的研究结果。这是一个小故事,所以请稍等。假设我们有以下 ActiveRecord 模型。我们只关心模型的适当更改cache_key,对吗?

我们已经有一篇文章,有一条评论。两者都出自不同的作者。目标是cache_key在以下情况下对文章进行更改:

  1. 文章的正文或标题更改
  2. 其评论的正文发生了变化
  3. 文章作者姓名变更
  4. 文章评论作者姓名变更

所以默认情况下,我们适用于案例 1 和 2。

但不适用于案例 3。

让我们cache_keyArticle.

赢!但这当然不适用于案例 4。

那么还有哪些选择呢?我们可以对 上的has_many关联做一些事情Author,但has_many没有{touch: true}选择,可能是有原因的。我想它可以按照以下方式实现。

虽然这确实有效。它通过加载、实例化和更新每篇文章和另一篇文章的评论,对性能产生巨大影响。我不相信这是一个正确的解决方案,但什么是?

当然 37signals 用例/示例可能会有所不同:project -> todolist -> todo. 但我想象一个单一的待办事项也属于用户。

如何解决这个缓存问题?

0 投票
2 回答
527 浏览

ruby-on-rails - 如何使用俄罗斯娃娃缓存保持缓存温暖?

我一直在 Rails 应用程序上试验俄罗斯娃娃片段缓存,更具体地说是在它的主仪表板页面上。这是用户登录后看到的第一页,是俄罗斯娃娃的绝佳候选者,因为它包含许多嵌套元素。

缓存在用户自己进行更改需要应用程序重新渲染仪表板的情况下运行良好。使用缓存的加载时间比渲染整个页面快 4 倍。

但是,存在数据被系统更改的情况。例如,每天晚上,我们都会根据前一天的新汇率更新所有值。这将自动使仪表板中的大部分片段过期,并且第二天早上用户登录时将遇到冷缓存。

是否可以在系统更新后重新生成这些片段缓存以使其保持温暖?我想我可以write在任何系统更新后手动处理这些片段,但我也必须手动管理密钥和依赖项。(我目前正在使用cache_digestgem,非常方便。)。

有任何想法吗?

0 投票
1 回答
649 浏览

ruby-on-rails - 使用带有模板继承的俄罗斯娃娃缓存的问题

我一直在一个相当复杂的 Rails 应用程序的选定部分中相互独立地使用模板继承和俄罗斯娃娃缓存(使用cache_digests gem ),并取得了很大的成功。

我很难以一种理智的方式一起使用这两种技术,这让我怀疑我可能做错了什么......

举一个非常简单的例子,考虑一个由两个控制器组成的应用程序,ThingOnes 和 ThingTwos。这个应用程序有一个布局 ( layouts/application.html.erb),它简单地呈现一个头文件:<%= render 'header' %>.

默认情况下,Rails 会在一堆位置中查找这个部分,包括布局的视图目录 ( views/application/_header.html.erb) 以及任何特定于当前控制器的位置 (likeviews/thing_ones/_header.html.erbviews/thing_twos/_header.html.erb)。这意味着,出于缓存目的,我基本上有一个模板依赖列表(不包括引擎或其他任何东西),如下所示:

现在,我们用缓存包装该渲染调用,如下所示:

不幸的是,运行rake cache_digests:nested_dependencies TEMPLATE=layouts/application会导致以下依赖项列表。

它似乎根本不关心模板继承。修改未包含在列表中的文件具有修改未包含在列表中的文件的预期效果 - 缓存未正确过期并显示过时的标头。

这可以通过指定相关的模板路径来轻松解决,如下所示:

这看起来确实是一个非常糟糕的解决方案,因为它不会很好地增长,并且需要大量琐碎的装饰来缓存调用以保留现有的模板继承行为。

类似地,可以更明确地指定标头位置,如下所示:

这也无法保留现有的模板继承行为,使其不适合我们的需求。

最后一个选择是将cache调用移动到标头部分本身。这不仅效率低下,因为它将render调用排除在缓存之外。它也比 DRY 更 WET(将所有内容写两次),这是一个很大的关闭。

所以,要解决我的实际问题......我这样做是否正确?这似乎是一个相当大的缺点,会影响各种各样的实现,但我真的找不到很多与这个特定问题相关的讨论,所以我想知道其他人是否以一种更好的方式来做这件事。有没有更好的方法来做到这一点,或者至少自动为部分渲染指定整个模板依赖层次结构?

0 投票
1 回答
414 浏览

ruby-on-rails-3 - Rails 4.0.0.0 俄罗斯娃娃缓存与 belongs_to 模型

我已经在我的模型中设置了一个缓存,比如

在我看来

所以,在这里我可以有许多商店,每个商店都有库存商品。上述缓存是否适用于不同的商店?

我认为即使在不同的商店中显示视图也会破坏缓存。或者,任何添加库存物品的商店都会破坏缓存。

我可以像这样使用俄罗斯娃娃缓存还是需要在我的模型中使用 Inventory.all?

0 投票
1 回答
699 浏览

ruby-on-rails-3 - 数据库中的角色和权限模型

我的项目中有一个用户模型和许多其他模型,以创建一个我实现角色和权限的 RBAC 系统。用户has_and_belongs_to_many角色和角色has_and_belongs_to_many权限。

在用户模型中我有:

角色定义在范围 ( role_for) 中,权限在角色范围内的模型中定义(项目是范围,任务是该范围内的模型)permission_for

在用户模型中,我需要从数据库中获取数据并检查用户是否能够执行该操作,在大量数据中需要太长时间。able?我实现的函数很简单,它只是加载每个用户的角色和每个角色的权限,然后检查权限的能力是否等于动作,然后返回true或false!

是否有任何宝石或代码可以做类似的事情?如果没有,你能给我建议如何以这种方式实现角色和权限,而数据库负载要少得多吗?

许多许多tahnk

编辑 1

好的,我已经创建了这个关系并设法在我的模型中使用它,正常使用的性能还可以,但是当我想要获取大量数据时,它非常慢。我需要在作用域模型中缓存角色和权限,我该怎么做?是否有任何 Rails 插件可以为我做到这一点?

0 投票
0 回答
288 浏览

ruby-on-rails - 俄罗斯娃娃缓存摘要部分没有冒泡

根据我对使用缓存摘要进行俄罗斯娃娃缓存的理解,为了防止我们必须对片段进行版本控制,如果我更新子片段,摘要键应该冒泡以使其父片段过期。

如果这是正确的,我会遇到一个问题,即我正在更新一个不会过期的子模板,它是父缓存。在这种情况下,我正在更改 /schoolworks/need_grading/row.html.haml 中的 html,并且由于 /schoolworks/need_grading/row.html.haml 上的缓存,这些更改永远不会反映出来。

两个不同页面的haml代码是:

我跑了 rake cache_digests:nested_dependencies TEMPLATE=schoolworks/need_grading 并返回

看起来嵌套依赖项与呈现的部分匹配。我不知道为什么这不会使父缓存过期。

0 投票
2 回答
3315 浏览

ruby-on-rails - Rails 缓存分页集合

只是对缓存分页项目集合的最佳方法进行一些研究。目前使用 jbuilder 输出 JSON 并且一直在使用各种 cache_key 选项。

我见过的最好的例子是使用最新记录的 updated_at 加上集合中的项目数量。

在这里定义:https ://gist.github.com/aaronjensen/6062912

但是,这不适用于分页项目,我的收藏中总是有 10 个项目。

有什么解决方法吗?

0 投票
1 回答
737 浏览

ruby-on-rails - Rails 俄罗斯娃娃缓存和 N+1

根据我对 Rails 中俄罗斯娃娃缓存的了解,当我们执行 RDC(俄罗斯娃娃缓存)时,急切加载相关对象或对象列表将是有害的,因为在 RDC 中,我们只是从数据库中加载顶级对象,并查找其缓存的渲染模板和服务。如果我们急切地加载相关的对象列表,如果缓存不是陈旧的,那么这些对象列表将毫无用处。

我的理解正确吗?如果是,我们如何确保在第一次调用时立即加载所有相关对象,以免在第一次加载期间(当缓存不热时)支付 N+1 查询的成本。