2014-03-27 42 views
0

我有一個Ruby應用程序,每分鐘需要大約10000個請求。 其中一些請求執行寫入數據庫表。到數據庫的最大連接數是200.寫入緩存vs寫入數據庫 - 性能基準?

我想知道什麼是更高效。在緩存中寫入數組並將數據保存在後臺中,或將每個請求直接保存到數據庫中? 如果我將數據寫入緩存中的數組,是否有任何競爭條件或性能問題? 有沒有更好的方法來優化性能並避免數據庫瓶頸?

示例代碼

#... 
    def self.add_data_message_to_queue(event_id, chat_item) 
    bucket_name = 'BUCKET_GET_CHAT_' + event_id.to_s 
    chat_queue = Rails.cache.fetch(bucket_name) 
    if chat_queue.blank? 
     chat_queue = [] 
    end 
    chat_queue.push(chat_item) 
    Rails.cache.write(bucket_name, chat_queue, expires_in:Integer(30).days) 
    end 
  • 服務器:獨角獸(高併發)

在此先感謝

回答

1

SOLUTION

根據基準寫入memcache是​​更有效率的方式。 雖然有必要處理競賽條件。根據memcachier團隊的反饋。

測試保存聊天消息DB enter image description here

同樣的測試 - 不保存聊天消息當前DB

響應時間是更好的方式。該應用程序還可以每分鐘處理更多請求。

enter image description here

處理競爭條件 *(反饋來自memcachier隊)

有,一般來說,兩個內存緩存來解決這個問題的方法:

既然你追加到一個數組,您可以改爲使用memcache的APPEND和PREPEND操作。它們在Rails.cache中不受支持,但底層庫Dalli支持這些命令。他們的語義是他們會在現有的值上附加/附加一個字符串。當你獲取這個值的時候,你會得到所有你「追加」的字符串連接在一起,所以你必須,例如,用分號或類似的東西來分隔每個元素,以便將它分解成一個數組。

更常用的解決方案(適用於任何數據競爭條件)是在memcache中使用版本控制支持。具體而言,memcache中的每個值都會分配一個版本,並在任何get請求上返回。在memcache中設置操作可以採用可選的CAS(用於比較和交換)字段,以便只有當版本與存儲的當前值匹配時操作纔會成功。再次,我相信Rails.cache不支持這一點,但Dalli通過cas方法做到了這點:

cache.add("bucket_get_chat", []) 
while(!cache.cas("bucket_get_chat") {|val| val.push(chat_item)}); end