2017-05-27 30 views
0

在Rails應用程序,說我有以下型號:緩存不經常更改的'詞典'表和最佳實踐是更好嗎?

class Movies < ActiveRecord::Base 
    has_many :movie_genres 
    has_many :genres, through: :movie_genres 
end 

class Genres < ActiveRecord::Base 
    has_many :movie_genres 
    has_many :movies, through: :movie_genres 
end 

class MovieGenre < ActiveRecord::Base 
    belongs_to :movies 
    belongs_to :genres 
end 

流派表無非是idlabel領域更多。在許多應用程序視圖和biz邏輯方法之間,我將需要非常頻繁地查找給定流派的id,但實際數據將極少改變。

在應用程序加載時只執行一次數據庫調用並將信息存儲到內存中是否有意義?

如果是的話,對此有什麼好的做法? Genre中的類變量?在初始化程序中設置全局變量?我知道如果在genres表上有一個事務,我將需要設置一個鉤子來重建這個內存存儲。

這個問題是在考慮縮放問題時提出的,其中genres只是許多查詢式數據庫表格中的一個,查詢式數據庫表格中數據頻繁變化但頻率高的查找。

+1

你問的緩存失效是計算機科學中唯一兩個難題之一:) –

回答

0

根本不推薦使用全局變量,最好的做法是使用rails caching,這種情況下效果最好。您可以設置高速緩存的expiry time按照方便,如果你需要更新緩存時添加新row,您可以只運行一個after_save回調並設置更新緩存像

Rails.cache.write(key, value, options) 

如果不是有喜歡多種選擇view cachingaction caching根據您的要求..

Memcachier是一個很好的緩存服務器提供作爲heroku插件,如果你使用heroku。

詳細閱讀有關Rails Caching瞭解其可行性和解決您的關注..

0

雖然內存緩存備份緩存(如@ Md.FarhanMemon的答案建議)是大多數情況下,一個足夠好的答案,半靜態的經常訪問的字典可能需要進程內緩存(沒有遠程調用=沒有開銷,如網絡延遲)。有幾種方法可以實現它(全局變量,類變量,類變量變量,也許是別的)。不過,這是一個實現細節。重要的是數據存儲在應用程序服務器的內存中。

通過幾行代碼,您可以實現超時和一切。那麼唯一的主要缺點是無法可靠/一致地在多個進程間更新緩存。但是,如果你的應用能夠處理稍微陳舊的字典一分鐘(假設你每分鐘刷新一次進程內緩存),那麼支付超高速緩存訪​​問費用便宜。

來源:我已經成功地在我的一個相當大的應用程序中使用這種類型的緩存(每天大約65M次點擊)。你的旅費可能會改變。

+0

當你說這種類型的用例「可能需要進行內緩存」時,你的意思是因爲該解決方案更簡單,沒有潛在的memcache服務器費用?任何其他優點? – Codosapien

+0

@Codosapien:memcache訪問會導致網絡開銷。即使幾毫秒也可能很重要,如果它真的是高讀取數據。 –