繁体   English   中英

Rails中的自动模型缓存过期

[英]Automatic model cache expiry in Rails

我正在阅读一些有关在Rails中进行缓存的指南,但是我错过了一些我无法调和的重要内容。

我了解自动过期缓存键的概念,以及如何根据模型的updated_at属性的派生方式构建缓存键,但是我无法弄清楚在没有先进行数据库查找的情况下它如何知道updated_at是什么(这正是缓存的部分设计目的是避免)?

例如:

cache @post

将结果存储在缓存键中,如下所示:

文章/ 2-20110501232725

据我了解Rails中的自动过期缓存键,如果@post被更新(并且updated_at属性被更改,则该键将改变。但是我不知道的是,随后对@post的查找如何知道如何获取密钥而不进行数据库查询即可获取新的updated_at值?Rails不必知道@ post.updated_at是什么,才可以访问缓存的版本吗?

换句话说,如果键包含updated_at时间戳,那么如何在不首先知道高速缓存是什么的情况下查找高速缓存?

在您的示例中,您不可避免地要访问数据库。 但是,这种缓存的目的是避免执行额外的工作,这些工作仅在每次发布更改时才需要执行。 从数据库中查找单个行应该非常快,然后根据该查找的结果,您可以避免执行比该单个查找更昂贵的额外工作。

您尚未完全指定,但我怀疑您是在视图中执行此操作。 在这种情况下,目标是避免在帖子发布之前不会改变的片段构建。 与岗位和标记来呈现这些属性可以是昂贵的,这取决于工作的排放相关的各种属性的迭代中完成的,所以给你有一个职位已经 ,能够避免工作在这种情况下获得的增益。

据我了解您的问题。 您正在尝试弄清缓存如何工作的黑魔法。 祝好运。

但是我认为潜在的问题是更新如何发生?

缓存元素应具有基于元素某些部分的逻辑键,例如复合键,以及基于项ID的某些键名。 您可以构建此密钥以在需要时调用缓存片段。 密钥始终是相同的,否则您将无法确定自己正在获得所需的东西。

缓存的一个基本假设是,缓存值是瞬态的,即,如果缓存值消失或过时,则没什么大不了的。 如果这很重要,那么缓存不是解决问题的方法。 缓存的目的是减轻高负载,即,大量流量击中数据库中的同一事物。 类似于一个可能有1百万人正在阅读特定博客帖子的网络日志。 它并不是要加快数据库的速度。 这是通过SQL优化,分片等完成的。

如果使用Dalli作为缓存存储,则可以设置到期时间。

本质上,Rails AFAIK中的缓存循环是这样的:

在此处输入图片说明

因此,回答您的问题:

密钥在更新时会更新。 与发布更新相关的操作。 您可以设置到期时间,通过新的查找/缓存写入强制缓存更新,从本质上可以达到所需的结果。 就高速缓存而言,它总是读取与键相对应的高速缓存元素。 如果它得到更新,则它将读取已更新的元素,但不是缓存对数据库进行检查的责任。

您可能正在寻找的是准备好的声明 在Prepared Statements上的Tenderlove或更快的数据存储区,例如不太安全的Postgres(即,在没有ACID的情况下调整为NoSQL)或NoSQL类型的数据库。

您的数据库中也有索引吗? 没有适当的索引,数据库请求将很慢。 您可能只需要“调整”数据库。

另外,还有一个很棒的叫做cell的 gem,至少在我的经验中,它使您可以用自己的视图做更多的事情,包括更快的返回率与渲染局部视图。 它还具有一些缓存功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM