首先,讓我說明情況,我有以下幾點:緩存(大和靜態)與類變量數據
「節點」類具有以下屬性:
- NODE_ID(唯一)
- NODE_NAME(唯一)
並與以下屬性 「NodeConnection」 級:
- node_from
- node_to
我們將有大約1〜3萬個節點和周圍的東西3 10萬個NodeConnections。
節點和連接導入一次後,它們不會更改。
在對Rails應用程序的每個請求中,我們必須通過可能的node_names查找10到100個node_id。我們必須查找幾百到幾千個node_connections。我們目前的原型沒有任何緩存(所以,很多數據庫查詢)和響應時間是可怕的(如2分鐘)。 因此,我們通過memcached切換到高速緩存節點和連接。
雖然表現有所提升,但仍然缺乏表現。 (因爲我們爲每個NodeConnection調用Cache.read,每個請求有幾千個調用)
現在,我們嘗試通過Classvariable緩存,並獲得了巨大的性能提升。 (幾百毫秒內響應時間)
# Pseudocode below
class Node
def nodes
@@nodes ||= get_nodes
end
def node_connections
@@node_connections ||= get_node_connections
end
end
所以,我想請教一下優點和反對該方案的。
缺點我有尚未:
- 每個Rails的對象必須建立自己的高速緩存(它自己的ClassVariables) - >較高的總內存使用
- 初始化緩存是耗時(1- 3分鐘),所以我們不能要求內做到這一點
任何其他解決方案在那裏緩存大(> 100MB)和靜態(數據應用生命週期中有效地不會改變)的數據,因此所有軌道同一臺機器內的實例可以非常快速地訪問此緩存(!)?
只是一個想法,不知道它的好還是壞 - 是否嘗試過使用'Struct'而不是實際的類,或者使用自定義的C綁定?這也可以提高性能,我會看看 –
。你可能有一些資源給C綁定的東西? – Deradon
其他的上帝或壞主意:寫一個小的C應用程序,在本地UNIX套接字上提供數據,並緩存數據本身 –