2010-10-19 98 views
1

對於Ruby on Rails應用程序,我有這個有幾個屬性的Movie對象。幾乎每一個頁面都需要將一些電影與按照評分排序的這些電影的完整列表進行比較,所以我曾經緩存這個大的排序列表。這很有用,因爲我可以直接使用此列表的電影及其所有屬性,而無需任何其他數據庫請求。一個大對象或一個小加一個大信息對象?

最近,這個列表變得更大了,大量的2500個電影不能適應1MB的Memcache塊。

我想知道是否將這個Movie對象分解爲一個較小的對象(id,created_at,updated_at,score,attributes_id)並將其屬性外化爲另一個對象是個不錯的主意。我會有一個按分數排序的較小的電影列表,但很多其他請求。

雖然我們在這,但爲什麼不緩存一個2500整數的數組,爲什麼不用Ruby來做數學,而只能得到我們感興趣的50部電影?它需要50個數據庫調用,還是我可以讓PostGreSQL給我一組電影2,5,6,89,...和2467?

我該怎麼辦?我錯過了什麼其他部分的問題?

謝謝你,

凱文

回答

1

而不是剝離出的屬性你的模型,你只需要什麼,爲什麼不加載?在進行簡單的數字比較時,直接使用數據通常對您有利,而不涉及模型。簡單哈希的存儲要求比完整的ActiveRecord實例要低得多。

在這種情況下,select_all是你的朋友:

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

+0

感謝的一個簡單的練習,這是偉大的! – 2010-10-22 13:29:48

相關問題