2014-03-27 66 views
1

我有兩個模型,稱爲DivisionTier,這些模型被查詢了很多,但插入或更新幾乎沒有做過。這些表只有少量或記錄,因此整個表可以存儲在內存中。Rails模型緩存

class Division 
    # position: integer 
    belongs_to :tier 
end 

class Tier 
    # name: string 
    has_many :tiers 
end 

這些表查詢中幾乎每一頁,所以它看起來像數據庫浪費調用

型號的緩存解決方案,如identity cache,這在memcached的緩存記錄,只允許你從緩存中檢索記錄由id。

了許多疑問都只是通過ID選擇,但是我也喜歡

SELECT * FROM divisions WHERE divisions.position BETWEEN ? AND ? 

我有幾個問題進行了大量的查詢

  1. 將在數據庫緩存這些表中的內存本身,使另一個緩存解決方案不必要?
  2. 如果不是,有沒有什麼辦法可以在內存中緩存這些模型,並使用除了id以外的條件查詢緩存?
  3. 我基本上要求redis/memcached的速度,但關係數據庫的功能,這是不可能的?

回答

2

Rails會緩存模式,避免重複DB查找,但只對具有相同的SQL查詢,且僅當SQL查詢已經在同一個客戶端的請求作出。因此可能需要另一個緩存解決方案。

對於您的情況(非易失性,參考數據),緩存聽起來像個好主意。然而,有幾個注意事項:

  • 正如你指出的那樣,你是不是總是ID查詢。這意味着你需要緩存給定範圍的結果(這似乎是一個糟糕的想法),或者你需要一個緩存,可以通過多個索引執行查找並在一個範圍內查找結果(elasticsearch將是這個)。

  • 當您修改數據(INSERT/UPDATE/DELETE)時,緩存可能會過時。範圍緩存尤其容易受到這種影響(另一個原因是它不是個好主意),但即使按索引緩存,仍然需要確保相應地更新緩存。