【问题标题】:Rails cache recordsRails 缓存记录
【发布时间】:2016-12-10 04:17:48
【问题描述】:
用Rails.cache缓存记录是个好主意吗?
我想缓存最后 15 条记录并显示它们。
例如
在模型中
def last_fifteens
last(15).map(&:title)
end
def cached
Rails.cache.write('last_fifteens',last_fifteens,expires_in: 1.hour)
end
def self.fetch_last_fifteens
Rails.fetch('last_fifteens')
end
比在视图中
Product.fetch_last_fifteens
或者这是一个不好的方法?
【问题讨论】:
标签:
ruby-on-rails
caching
【解决方案1】:
在大多数情况下,像上面提到的那样简单的缓存查询不会对您的应用程序产生任何重大影响(除了使您的代码库更复杂)(除非您的应用程序获得与 Twitter 或 Facebook 相当的流量,这是极不可能的: ))。只有在监控和基准测试应用程序性能后,才应执行此类低级优化。
但是看看上面的示例代码,代码可能会有所改进。有两种可能的情况
模型不存在默认范围
您无需担心。
模型有一个默认范围
查看正在形成的查询总是一个好习惯。在大多数情况下,解决方案不会是最佳的。例如
class Location < ActiveRecord::Base
default_scope -> { order("locations.name ASC") }
end
这里当我调用 Location.last(15) 时,将执行以下数据库查询:
SELECT `locations`.* FROM `locations` ORDER BY locations.name asc
换句话说,我们从数据库中获取所有位置,然后在 Ruby 中,结果集仅被过滤到最后 15 个数组元素。如果位置表有非常多的条目,我们实际上是在获取所有条目并将我们的数据集切片为最后 15 个条目。
在这种情况下,编写我们自己的方法更有意义,该方法与 default_scope 相反。
确保存在适当的索引也是有意义的