我正在阅读一些关于Rails缓存的指南,但我遗漏了一些我无法调和的重要内容。
我理解自动过期缓存键的概念,以及它们是如何构建模型的updated_at属性的衍生物,但我无法弄清楚它如何在没有首先进行数据库查找的情况下知道updated_at是什么(这是究竟是什么缓存部分设计,以避免)?
例如:
cache @post
将结果存储在缓存键中,如:
文章/ 2-20110501232725
据我了解Rails中的自动过期缓存键,如果@post被更新(并且更新了updated_at属性,那么密钥将会改变。但是我无法弄清楚,后续查找到@post是什么知道如何在不进行数据库查找的情况下获取密钥以获取新的updated_at值吗?Rails是否必须知道@ post.updated_at在它可以访问缓存版本之前是什么?
换句话说,如果密钥包含updated_at时间戳,那么如何在不知道它是什么的情况下查找缓存呢?
答案 0 :(得分:2)
在您的示例中,您无法避免命中数据库。但是,这种缓存的目的是避免进行额外的工作,这只需要在每次帖子更改时执行一次。从数据库中查找单行应该非常快,然后根据查找结果,您可以避免执行比单个查找更昂贵的额外工作。
您没有完全指定,但我怀疑您是在视图中执行此操作。在这种情况下,目标是避免在帖子发生之前不会改变的片段构建。根据正在完成的工作,迭代与帖子相关的各种属性以及标记的发布以呈现这些属性可能很昂贵,所以假设你已经有帖子,能够避免这项工作是在这种情况下获得的收益。
答案 1 :(得分:1)
据我了解你的问题。您正试图找出缓存如何工作的黑魔法。祝好运。
但我认为根本问题是更新是如何发生的?
缓存元素应该具有基于元素的某个部分的逻辑密钥,例如,复合键,一些基于项目ID的键名。您可以构建此密钥以在需要时调用缓存片段。钥匙总是一样的,否则你无法确定你得到了你想要的东西。
缓存的一个基本假设是缓存值是瞬态的,即如果它消失或过时则不是什么大不了的事。如果这是一个大问题,那么缓存不是解决问题的方法。缓存旨在缓解高负载,即大量流量在数据库中发生同样的事情。类似于一个博客,其中1,000,000人可能正在阅读特定的博客文章。它并不意味着加快你的数据库。这是通过SQL优化,分片等完成的。
如果您使用Dalli作为缓存存储,则可以设置到期日期。
基本上,Rails中的缓存循环AFAIK的工作原理如下:
所以回答你的问题:
更新密钥时,密钥会更新。与帖子更新相关的操作。您可以设置到期时间,这实质上通过新的查找/缓存写入强制缓存更新来实现所需的结果。就缓存而言,它总是读取与密钥对应的缓存元素。如果它得到更新,那么它将读取更新的元素,但它不是缓存检查数据库的责任。
您可能正在寻找的是prepared statement。 Tenderlove on Prepared Statements或更快的数据存储区,如安全性较低的Postgres(即在没有ACID的情况下调到NoSQL)或NoSQL类型的数据库。
您的数据库中是否还有索引?如果没有正确的索引,数据库请求会很慢。你可能只需要调整"你的数据库。
还有一个名为cells的精彩宝石,它可以让你对你的视图做更多的事情,包括更快的回报和渲染部分,至少在我的经验中。它还具有一些缓存功能。