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

          (轉)使用memcached進行內存緩存

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

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

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

          如何使用memcached-Client端?
          在應用端包含一個用于描述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

          為什么不使用數據庫做這些?

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

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

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

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

          Memcached快嗎?

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

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


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


          網站導航:
           
          主站蜘蛛池模板: 宁都县| 定陶县| 贵南县| 宜章县| 建湖县| 和平区| 金沙县| 宜州市| 花莲县| 庆元县| 井陉县| 湘潭县| 育儿| 菏泽市| 威远县| 绥阳县| 伊通| 新巴尔虎左旗| 金华市| 桓台县| 泰宁县| 河曲县| 如东县| 嫩江县| 涿鹿县| 呼伦贝尔市| 罗甸县| 新津县| 防城港市| 崇义县| 循化| 安龙县| 神农架林区| 濮阳市| 东平县| 固原市| 华安县| 修文县| 白河县| 鲁山县| 新龙县|