文:阿蜜果
日期:2011-2-14
1、概念
近年來,內存容量不斷提高,價格不斷下跌,操作系統已經可以支持更大的地址空間,充分利用技術提升系統性能成為一個熱點。
可從數據庫方面來考慮,此種方案可使用“內存數據庫”,另一種方案是使用“內存對象緩存系統”,將某些量小、使用次數多的數據以key/value的方式保存在內存對象緩存系統中,減少數據庫查詢訪問帶來的性能下降。
在本文中,主要講述后者,但在本章也對“內存數據庫”的概念進行說明。
1.1 內存數據庫
內存數據庫,就是將數據放在內存中直接操作的數據庫。相對于磁盤,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁盤上訪問能夠極大地提高應用的性能。
在數據庫技術中,目前主要使用兩種方法來使用大量的內存:
1) 在傳統的數據庫中,增大緩沖池,將一個事務所涉及的數據都放在緩沖池中,組織成相應的數據結構來進行查詢和更新處理,也就是常說的共享內存技術,這種方法優化的主要目標是最小化磁盤訪問。
2) 使用內存數據庫技術(也叫主存數據庫)技術,也就是干脆重新設計一種數據庫管理系統,對查詢處理、并發控制和恢復的算法和數據結構進行重新設計,以更有效的使用CPU周期和內存,這種技術近乎把整個數據庫放進內存中,因而產生一種根本性的變化。
1.2 內存對象緩存系統
內存對象緩存系統用于動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度。
常用的是Memcached 是一個高性能的分布式內存對象緩存系統,它基于一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcached協議與守護進程通信。但是它并不提供冗余(例如,復制其hashmap條目);當某個服務器S停止運行或崩潰了,所有存放在S上的鍵/值對都將丟失。
Memcached由Danga Interactive開發,用于提升LiveJournal.com訪問速度的。LJ每秒動態頁面訪問量幾千次,用戶700萬。Memcached將數據庫負載大幅度降低,更好的分配資源,更快速訪問。
2、應用場景
Memcached一般與數據庫系統配合使用,它用于存儲一些經常需要讀取的數據,從來達到提高性能的目的。
下面講幾個在呼叫中心系統中的應用實例。
2.1 任務可執行性檢查
例如,外呼任務需要在指定“任務開始時間”和“任務結束時間”中運行,并且在“啟用”狀態才能運行,而且單個外呼任務的進程需要通過查詢數據庫定時檢查(例如:1分鐘)該任務是繼續運行,還是終止運行。當多個外呼任務并行運行時,這種查詢會給系統增加負擔。
若使用內存對象緩存系統,將每個任務的狀態信息以key/value對的方式存儲在Memcached的“任務信息表”中(key=任務id,value:是否可運行標志),在插入任務時,在Memcached的“任務狀態表”中插入一條數據;當“任務開始時間”和“任務結束時間”或“狀態”發生改變時,根據key對應改變Memcached的“任務信息表”的value值。在外呼任務進行中,查詢任務是否可運行時不再需要查詢數據庫,一般情況下只需要查詢Memcached即可,從而減少了對數據庫的訪問。
2.2 日程檢查
在呼叫中心路由時,有時候需要提供根據日程進行路由的功能,例如滿足某個日程(例如:每年的“10月1日00:00:00”到“10月7日23:59:59”的日程)時才路由到A中繼。一個日程可以對應多個條目,若在路由前需要要驗證當前時間是否滿足日程,那對應需要查詢兩表的信息,還需要是否滿足日程條件。當并發很多個用戶進行呼叫時,這種檢查會給系統增加很大的負荷,在此處也可以使用內存對象緩存系統來解決問題。
開發定時觸發(1分鐘執行一次)程序去日程表和日程條目表中查詢多條信息,將當前時間與某個日程比較,將其存入Memcached中的“日程表”中,key為日程鍵,value為當前時間是否在當前日程內的標志。
路由程序根據日程鍵檢查Memcached中的“日程表”,若滿足某個日程,則路由到A中繼,基本不再需要針對日程對數據庫進行查詢。
3、應用禁忌
3.1 不要將Memcached當數據庫用
Memcached 的首要目的就是加快數據的響應時間,否則數據從其他數據源構建或恢復需要很長時間。一個典型的例子就是從一個數據庫中恢復信息,特別是在信息顯示給用戶前 需要對信息進行格式化或處理的時候。Memcached 被設計用來將信息存儲在內存中以避免每次在數據需要恢復時重復執行相同的任務。
切不可將 Memcached 用作運行應用程序所需信息的惟一信息源;數據應總是可以從其他信息源獲取。此外,要記住 Memcached 只是一個鍵/值的存儲。不能在數據上執行查詢,或者對內容進行迭代來提取信息。
3.2 不要使用Memcached存儲大批量數據
首先Memcached空間大小不算大,而且主要用于緩存,所以不應該在Memcached中存儲大批量數據。若在Memcached中按照一定格式存儲數據表的行數據,而且表的數據量又很大,首先空間不允許,而且查詢非常麻煩,此類數據適合保存在數據庫中。
3.2 Memcached并不安全
為了確保最佳性能,Memcached 并未提供任何形式的安全性,沒有身份驗證,也沒有加密。這意味著對 memcached 服務器的訪問應該這么處理:一是通過將它們放到應用程序部署環境相同的私有側,二是如果安全性是必須的,那么就使用 UNIX® socket 并只允許當前主機上的應用程序訪問此 Memcached 服務器。
這多少犧牲了一些靈活性和彈性,以及跨網絡上的多臺機器共享 RAM 緩存的能力,但這是在目前的情況下確保 memcached 數據安全性的惟一一種解決方案。
4、附錄
《常用內存數據庫介紹》:
http://www.360doc.com/content/10/1202/16/3196411_74404034.shtml
《內存數據庫_百度百科》:
http://baike.baidu.com/view/1210875.htm
《memcached_百度百科》:
http://baike.baidu.com/view/794242.htm
《使用memcached提升站點性能》:
http://www.oschina.net/bbs/thread/11008
posted on 2011-02-15 12:42
阿蜜果 閱讀(2684)
評論(0) 編輯 收藏 所屬分類:
Java 、
解決方案