对于 Ruby on Rails 应用程序,我有这个具有多个属性的 Movie 对象。几乎每个页面都需要将一些电影与按评级排序的这些电影的完整列表进行比较,所以我曾经缓存这个大的排序列表。这很有用,因为我可以直接使用这个电影列表及其所有属性,而无需任何其他数据库请求。
最近,这个列表变得越来越大,一个 2500 部电影的大阵列无法放入 1MB 的 Memcache block 中。
我想知道将这个 Movie 对象拆分为一个较小的对象(id、created_at、updated_at、score、attributes_id)并将其属性外化到另一个对象中是否是个好主意。我会有一个较小的按分数排序的电影列表,但还有很多其他请求。
既然如此,为什么不缓存一个包含 2500 个整数的数组,用 Ruby 做数学运算,只得到我们感兴趣的 50 部电影呢?它需要 50 次数据库调用,还是我可以让 PostGreSQL 给我一个电影 2、5、6、89、……和 2467 的数组?
我该怎么办?我还遗漏了问题的哪些其他部分?
谢谢你,
凯文
最佳答案
与其从模型中剥离属性,不如只加载您需要的属性?在进行简单的数值比较时,直接使用数据而不是涉及模型通常对您有利。简单散列的存储要求大大低于完整的 ActiveRecord 实例。
在这种情况下,select_all
是您的 friend :
class Movie < ActiveRecord::Base
def self.data_for(*ids)
select_all(
sanitize_sql([ "SELECT id, score FROM #{quote_table_name} WHERE id IN (?)", ids.flatten ])
).inject({ }) do |h, row|
h[row[:id].to_i] = row
h
end
end
end
这将产生一个简单的散列,看起来像这样:
Movie.data_for(2, 5, 6, 89, 2467)
# => { 2 => { :id = > '2', :score => '4' }, ... }
如果你想根据需要将字符串转换为整数,你可以清理结构,这将进一步降低你的存储需求。您可以使用纯数字和简单的散列来存储大量数据。
在这一点上,将这个散列存储在 Memcache 中是使用 Rails.cache
关于ruby-on-rails - 一个大对象还是一个小加一个大信息对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972916/