posts - 297,  comments - 1618,  trackbacks - 0
           

          文:阿蜜果

          日期:2011-2-14

          1、概念

          近年來,內(nèi)存容量不斷提高,價格不斷下跌,操作系統(tǒng)已經(jīng)可以支持更大的地址空間,充分利用技術(shù)提升系統(tǒng)性能成為一個熱點。

          可從數(shù)據(jù)庫方面來考慮,此種方案可使用“內(nèi)存數(shù)據(jù)庫”,另一種方案是使用“內(nèi)存對象緩存系統(tǒng)”,將某些量小、使用次數(shù)多的數(shù)據(jù)以key/value的方式保存在內(nèi)存對象緩存系統(tǒng)中,減少數(shù)據(jù)庫查詢訪問帶來的性能下降。

          在本文中,主要講述后者,但在本章也對“內(nèi)存數(shù)據(jù)庫”的概念進(jìn)行說明。

          1.1 內(nèi)存數(shù)據(jù)庫

          內(nèi)存數(shù)據(jù)庫,就是將數(shù)據(jù)放在內(nèi)存中直接操作的數(shù)據(jù)庫。相對于磁盤,內(nèi)存的數(shù)據(jù)讀寫速度要高出幾個數(shù)量級,將數(shù)據(jù)保存在內(nèi)存中相比從磁盤上訪問能夠極大地提高應(yīng)用的性能。

          在數(shù)據(jù)庫技術(shù)中,目前主要使用兩種方法來使用大量的內(nèi)存:

          1)              在傳統(tǒng)的數(shù)據(jù)庫中,增大緩沖池,將一個事務(wù)所涉及的數(shù)據(jù)都放在緩沖池中,組織成相應(yīng)的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行查詢和更新處理,也就是常說的共享內(nèi)存技術(shù),這種方法優(yōu)化的主要目標(biāo)是最小化磁盤訪問。

          2)              使用內(nèi)存數(shù)據(jù)庫技術(shù)(也叫主存數(shù)據(jù)庫)技術(shù),也就是干脆重新設(shè)計一種數(shù)據(jù)庫管理系統(tǒng),對查詢處理、并發(fā)控制和恢復(fù)的算法和數(shù)據(jù)結(jié)構(gòu)進(jìn)行重新設(shè)計,以更有效的使用CPU周期和內(nèi)存,這種技術(shù)近乎把整個數(shù)據(jù)庫放進(jìn)內(nèi)存中,因而產(chǎn)生一種根本性的變化。

          1.2 內(nèi)存對象緩存系統(tǒng)

          內(nèi)存對象緩存系統(tǒng)用于動態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提供動態(tài)、數(shù)據(jù)庫驅(qū)動網(wǎng)站的速度。

          常用的是Memcached 是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),它基于一個存儲鍵/值對的hashmap。其守護(hù)進(jìn)程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcached協(xié)議與守護(hù)進(jìn)程通信。但是它并不提供冗余(例如,復(fù)制其hashmap條目);當(dāng)某個服務(wù)器S停止運行或崩潰了,所有存放在S上的鍵/值對都將丟失。

          MemcachedDanga Interactive開發(fā),用于提升LiveJournal.com訪問速度的。LJ每秒動態(tài)頁面訪問量幾千次,用戶700萬。Memcached將數(shù)據(jù)庫負(fù)載大幅度降低,更好的分配資源,更快速訪問。

          2、應(yīng)用場景

          Memcached一般與數(shù)據(jù)庫系統(tǒng)配合使用,它用于存儲一些經(jīng)常需要讀取的數(shù)據(jù),從來達(dá)到提高性能的目的。

          下面講幾個在呼叫中心系統(tǒng)中的應(yīng)用實例。

          2.1 任務(wù)可執(zhí)行性檢查

          例如,外呼任務(wù)需要在指定“任務(wù)開始時間”和“任務(wù)結(jié)束時間”中運行,并且在“啟用”狀態(tài)才能運行,而且單個外呼任務(wù)的進(jìn)程需要通過查詢數(shù)據(jù)庫定時檢查(例如:1分鐘)該任務(wù)是繼續(xù)運行,還是終止運行。當(dāng)多個外呼任務(wù)并行運行時,這種查詢會給系統(tǒng)增加負(fù)擔(dān)。

          若使用內(nèi)存對象緩存系統(tǒng),將每個任務(wù)的狀態(tài)信息以key/value對的方式存儲在Memcached的“任務(wù)信息表”中(key=任務(wù)idvalue:是否可運行標(biāo)志),在插入任務(wù)時,在Memcached的“任務(wù)狀態(tài)表”中插入一條數(shù)據(jù);當(dāng)“任務(wù)開始時間”和“任務(wù)結(jié)束時間”或“狀態(tài)”發(fā)生改變時,根據(jù)key對應(yīng)改變Memcached的“任務(wù)信息表”的value值。在外呼任務(wù)進(jìn)行中,查詢?nèi)蝿?wù)是否可運行時不再需要查詢數(shù)據(jù)庫,一般情況下只需要查詢Memcached即可,從而減少了對數(shù)據(jù)庫的訪問。

          2.2 日程檢查

                   在呼叫中心路由時,有時候需要提供根據(jù)日程進(jìn)行路由的功能,例如滿足某個日程(例如:每年的“10100:00:00”到“10723:59:59”的日程)時才路由到A中繼。一個日程可以對應(yīng)多個條目,若在路由前需要要驗證當(dāng)前時間是否滿足日程,那對應(yīng)需要查詢兩表的信息,還需要是否滿足日程條件。當(dāng)并發(fā)很多個用戶進(jìn)行呼叫時,這種檢查會給系統(tǒng)增加很大的負(fù)荷,在此處也可以使用內(nèi)存對象緩存系統(tǒng)來解決問題。

                   開發(fā)定時觸發(fā)(1分鐘執(zhí)行一次)程序去日程表和日程條目表中查詢多條信息,將當(dāng)前時間與某個日程比較,將其存入Memcached中的“日程表”中,key為日程鍵,value為當(dāng)前時間是否在當(dāng)前日程內(nèi)的標(biāo)志。

                   路由程序根據(jù)日程鍵檢查Memcached中的“日程表”,若滿足某個日程,則路由到A中繼,基本不再需要針對日程對數(shù)據(jù)庫進(jìn)行查詢。

          3、應(yīng)用禁忌

          3.1 不要將Memcached當(dāng)數(shù)據(jù)庫用

          Memcached 的首要目的就是加快數(shù)據(jù)的響應(yīng)時間,否則數(shù)據(jù)從其他數(shù)據(jù)源構(gòu)建或恢復(fù)需要很長時間。一個典型的例子就是從一個數(shù)據(jù)庫中恢復(fù)信息,特別是在信息顯示給用戶前 需要對信息進(jìn)行格式化或處理的時候。Memcached 被設(shè)計用來將信息存儲在內(nèi)存中以避免每次在數(shù)據(jù)需要恢復(fù)時重復(fù)執(zhí)行相同的任務(wù)。

          切不可將 Memcached 用作運行應(yīng)用程序所需信息的惟一信息源;數(shù)據(jù)應(yīng)總是可以從其他信息源獲取。此外,要記住 Memcached 只是一個鍵/值的存儲。不能在數(shù)據(jù)上執(zhí)行查詢,或者對內(nèi)容進(jìn)行迭代來提取信息。

          3.2 不要使用Memcached存儲大批量數(shù)據(jù)

                   首先Memcached空間大小不算大,而且主要用于緩存,所以不應(yīng)該在Memcached中存儲大批量數(shù)據(jù)。若在Memcached中按照一定格式存儲數(shù)據(jù)表的行數(shù)據(jù),而且表的數(shù)據(jù)量又很大,首先空間不允許,而且查詢非常麻煩,此類數(shù)據(jù)適合保存在數(shù)據(jù)庫中。

          3.2 Memcached并不安全

          為了確保最佳性能,Memcached 并未提供任何形式的安全性,沒有身份驗證,也沒有加密。這意味著對 memcached 服務(wù)器的訪問應(yīng)該這么處理:一是通過將它們放到應(yīng)用程序部署環(huán)境相同的私有側(cè),二是如果安全性是必須的,那么就使用 UNIX® socket 并只允許當(dāng)前主機(jī)上的應(yīng)用程序訪問此 Memcached 服務(wù)器。

          這多少犧牲了一些靈活性和彈性,以及跨網(wǎng)絡(luò)上的多臺機(jī)器共享 RAM 緩存的能力,但這是在目前的情況下確保 memcached 數(shù)據(jù)安全性的惟一一種解決方案。

          4、附錄

                   《常用內(nèi)存數(shù)據(jù)庫介紹》:

          http://www.360doc.com/content/10/1202/16/3196411_74404034.shtml

                   《內(nèi)存數(shù)據(jù)庫_百度百科》:

                   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 阿蜜果 閱讀(2692) 評論(0)  編輯  收藏 所屬分類: Java解決方案
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關(guān)注blog

          積分與排名

          • 積分 - 2298189
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 枣阳市| 西盟| 肥西县| 湛江市| 临猗县| 汶川县| 垣曲县| 茌平县| 鄄城县| 九江市| 西宁市| 七台河市| 盐城市| 万全县| 吉林市| 皮山县| 南华县| 临海市| 新巴尔虎右旗| 南丹县| 呼伦贝尔市| 平和县| 吉隆县| 贡觉县| 阿尔山市| 射洪县| 固阳县| 江永县| 五峰| 夏津县| 神木县| 邢台市| 长沙市| 延津县| 晴隆县| 裕民县| 南投县| 渭源县| 霍城县| 金昌市| 新密市|