【问题标题】: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 相反。

    确保存在适当的索引也是有意义的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2012-07-07
      • 2011-07-03
      • 1970-01-01
      • 2016-09-20
      • 2016-01-01
      • 1970-01-01
      相关资源
      最近更新 更多