簡單-高效-優(yōu)雅

          (轉(zhuǎn))使用memcached進(jìn)行內(nèi)存緩存

          通常的網(wǎng)頁緩存方式有動態(tài)緩存和靜態(tài)緩存等幾種,在ASP.NET中已經(jīng)可以實現(xiàn)對頁面局部進(jìn)行緩存,而使用memcached的緩存比 ASP.NET的局部緩存更加靈活,可以緩存任意的對象,不管是否在頁面上輸出。而memcached最大的優(yōu)點是可以分布式的部署,這對于大規(guī)模應(yīng)用來說也是必不可少的要求。
          LiveJournal.com使用了memcached在前端進(jìn)行緩存,取得了良好的效果,而像wikipedia,sourceforge等也采用了或即將采用memcached作為緩存工具。memcached可以大規(guī)模網(wǎng)站應(yīng)用發(fā)揮巨大的作用。

          Memcached是什么?
          Memcached是高性能的,分布式的內(nèi)存對象緩存系統(tǒng),用于在動態(tài)應(yīng)用中減少數(shù)據(jù)庫負(fù)載,提升訪問速度。
          Memcached由Danga Interactive開發(fā),用于提升LiveJournal.com訪問速度的。LJ每秒動態(tài)頁面訪問量幾千次,用戶700萬。Memcached將數(shù)據(jù)庫負(fù)載大幅度降低,更好的分配資源,更快速訪問。

          如何使用memcached-Server端?
          在服務(wù)端運行:
          # ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
          這將會啟動一個占用2G內(nèi)存的進(jìn)程,并打開11211端口用于接收請求。由于32位系統(tǒng)只能處理4G內(nèi)存的尋址,所以在大于4G內(nèi)存使用PAE的32位服務(wù)器上可以運行2-3個進(jìn)程,并在不同端口進(jìn)行監(jiān)聽。

          如何使用memcached-Client端?
          在應(yīng)用端包含一個用于描述Client的Class后,就可以直接使用,非常簡單。
          PHP Example:
          $options["servers"] = array("192.168.1.41:11211", "192.168.1.42:11212");
          $options["debug"] = false;
          $memc = new MemCachedClient($options);
          $myarr = array("one","two", 3);
          $memc->set("key_one", $myarr);
          $val = $memc->get("key_one");
          print $val[0]."\n"; // prints 'one‘
          print $val[1]."\n"; // prints 'two‘
          print $val[2]."\n"; // prints 3

          為什么不使用數(shù)據(jù)庫做這些?

          暫且不考慮使用什么樣的數(shù)據(jù)庫(MS-SQL, Oracle, Postgres, MysQL-InnoDB, etc..), 實現(xiàn)事務(wù)(ACID,Atomicity, Consistency, Isolation, and Durability )需要大量開銷,特別當(dāng)使用到硬盤的時候,這就意味著查詢可能會阻塞。當(dāng)使用不包含事務(wù)的數(shù)據(jù)庫(例如Mysql-MyISAM),上面的開銷不存在,但讀線程又可能會被寫線程阻塞。
          Memcached從不阻塞,速度非常快。

          為什么不使用共享內(nèi)存?
          最初的緩存做法是在線程內(nèi)對對象進(jìn)行緩存,但這樣進(jìn)程間就無法共享緩存,命中率非常低,導(dǎo)致緩存效率極低。后來出現(xiàn)了共享內(nèi)存的緩存,多個進(jìn)程或者線程共享同一塊緩存,但畢竟還是只能局限在一臺機(jī)器上,多臺機(jī)器做相同的緩存同樣是一種資源的浪費,而且命中率也比較低。
          Memcached Server和Clients共同工作,實現(xiàn)跨服務(wù)器分布式的全局的緩存。并且可以與Web Server共同工作,Web Server對CPU要求高,對內(nèi)存要求低,Memcached Server對CPU要求低,對內(nèi)存要求高,所以可以搭配使用。

          Mysql 4.x的緩存怎么樣?
          Mysql查詢緩存不是很理想,因為以下幾點:
          當(dāng)指定的表發(fā)生更新后,查詢緩存會被清空。在一個大負(fù)載的系統(tǒng)上這樣的事情發(fā)生的非常頻繁,導(dǎo)致查詢緩存效率非常低,有的情況下甚至還不如不開,因為它對cache的管理還是會有開銷。
          在32位機(jī)器上,Mysql對內(nèi)存的操作還是被限制在4G以內(nèi),但memcached可以分布開,內(nèi)存規(guī)模理論上不受限制。
          Mysql上的是查詢緩存,而不是對象緩存,如果在查詢后還需要大量其它操作,查詢緩存就幫不上忙了。
          如果要緩存的數(shù)據(jù)不大,并且查詢的不是非常頻繁,這樣的情況下可以用Mysql 查詢緩存,不然的話memcached更好。

          數(shù)據(jù)庫同步怎么樣?
          這里的數(shù)據(jù)庫同步是指的類似Mysql Master-Slave模式的靠日志同步實現(xiàn)數(shù)據(jù)庫同步的機(jī)制。
          你可以分布讀操作,但無法分布寫操作,但寫操作的同步需要消耗大量的資源,而且這個開銷是隨著slave服務(wù)器的增長而不斷增長的。
          下一步是要對數(shù)據(jù)庫進(jìn)行水平切分,從而讓不同的數(shù)據(jù)分布到不同的數(shù)據(jù)庫服務(wù)器組上,從而實現(xiàn)分布的讀寫,這需要在應(yīng)用中實現(xiàn)根據(jù)不同的數(shù)據(jù)連接不同的數(shù)據(jù)庫。
          當(dāng)這一模式工作后(我們也推薦這樣做),更多的數(shù)據(jù)庫導(dǎo)致更多的讓人頭疼的硬件錯誤。
          Memcached可以有效的降低對數(shù)據(jù)庫的訪問,讓數(shù)據(jù)庫用主要的精力來做不頻繁的寫操作,而這是數(shù)據(jù)庫自己控制的,很少會自己阻塞 自己。

          Memcached快嗎?

          非常快,它使用libevent,可以應(yīng)付任意數(shù)量打開的連接(使用epoll,而非poll),使用非阻塞網(wǎng)絡(luò)IO,分布式散列對象到不同的服務(wù)器,查詢復(fù)雜度是O(1)。

          posted on 2008-05-29 12:28 BigOnion 閱讀(183) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 东安县| 兴隆县| 景洪市| 云安县| 江永县| 海伦市| 隆安县| 思茅市| 蛟河市| 湘乡市| 阳山县| 左贡县| 子长县| 汉中市| 永胜县| 雷山县| 贵南县| 万州区| 景德镇市| 随州市| 永春县| 开化县| 呼伦贝尔市| 昭平县| 濮阳市| 扎赉特旗| 武功县| 海阳市| 苗栗县| 定远县| 洛扎县| 金山区| 沙坪坝区| 宝山区| 林芝县| 收藏| 榆社县| 莱西市| 崇仁县| 红安县| 三门峡市|