memcache深入解析

1.爲什麼要使用memcache
由於網站的高併發讀寫需求,傳統的關係型數據庫開始出現瓶頸,例如:
1)對數據庫的高併發讀寫:
關係型數據庫本身就是個龐然大物,處理過程非常耗時(如解析SQL語句,事務處理等)。如果對關係型數據庫進行高併發讀寫(每秒上萬次的訪問),那麼它是無法承受的。
2)對海量數據的處理:
對於大型的SNS網站,每天有上千萬次的蘇劇產生(如twitter, 新浪微博)。對於關係型數據庫,如果在一個有上億條數據的數據表種查找某條記錄,效率將非常低。
使用memcache能很好的解決以上問題。
在實際使用中,通常把數據庫查詢的結果保存到Memcache中,下次訪問時直接從memcache中讀取,而不再進行數據庫查詢操作,這樣就在很大程度上減少了數據庫的負擔。
保存在memcache中的對象實際放置在內存中,這也是memcache如此高效的原因。
\
2.memcache的安裝和使用
這個網上有太多教程了,不做贅言。
 

3.基於libevent的事件處理


libevent是個程序庫,它將Linux的epoll、BSD類操作系統的kqueue等事件處理功能 封裝成統一的接口。即使對服務器的連接數增加,也能發揮O(1)的性能。
memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等操作系統上發揮其高性能。
參考:
libevent: http://www.monkey.org/~provos/libevent/
The C10K Problem: http://www.kegel.com/c10k.html

4.memcache使用實例:

<?php
$mc = new Memcache();
$mc->connect('127.0.0.1', 11211);

$uid = (int)$_GET['uid'];
$sql = "select * from users where uid='uid' ";
$key = md5($sql);
if(!($data = $mc->get($key))) {
    $conn = mysql_connect('localhost', 'test', 'test');
    mysql_select_db('test');
    $result = mysql_fetch_object($result);
    while($row = mysql_fetch_object($result)) {
          $data[] = $row;
    }
    $mc->add($key, $datas);
}

var_dump($datas);
?>

5.memcache如何支持高併發(此處還需深入研究)

memcache使用多路複用I/O模型,如(epoll, select等),傳統I/O中,系統可能會因爲某個用戶連接還沒做好I/O準備而一直等待,知道這個連接做好I/O準備。這時如果有其他用戶連接到服務器,很可能會因爲系統阻塞而得不到響應。

而多路複用I/O是一種消息通知模式,用戶連接做好I/O準備後,系統會通知我們這個連接可以進行I/O操作,這樣就不會阻塞在某個用戶連接。因此,memcache才能支持高併發。

此外,memcache使用了多線程機制。可以同時處理多個請求。線程數一般設置爲CPU核數,這研報告效率最高。

6.使用Slab分配算法保存數據

slab分配算法的原理是:把固定大小(1MB)的內存分爲n小塊,如下圖所示:

\

slab分配算法把每1MB大小的內存稱爲一個slab頁,每次向系統申請一個slab頁,然後再通過分隔算法把這個slab頁分割成若干個小塊的chunk

 再總結MemCache的特性和限制

  上面已經對於MemCache做了一個比較詳細的解讀,這裏再次總結MemCache的限制和特性:

  1、MemCache中可以保存的item數據量是沒有限制的,只要內存足夠

  2、MemCache單進程在32位機中最大使用內存爲2G,這個之前的文章提了多次了,64位機則沒有限制

  3、Key最大爲250個字節,超過該長度無法存儲

  4、單個item最大數據是1MB,超過1MB的數據不予存儲

  5、MemCache服務端是不安全的,比如已知某個MemCache節點,可以直接telnet過去,並通過flush_all讓已經存在的鍵值對立即失效

  6、不能夠遍歷MemCache中所有的item,因爲這個操作的速度相對緩慢且會阻塞其他的操作

  7、MemCache的高性能源自於兩階段哈希結構:第一階段在客戶端,通過Hash算法根據Key值算出一個節點;第二階段在服務端,通過一個內部的Hash算法,查找真正的item並返回給客戶端。從實現的角度看,MemCache是一個非阻塞的、基於事件的服務器程序

  8、MemCache設置添加某一個Key值的時候,傳入expiry爲0表示這個Key值永久有效,這個Key值也會在30天之後失效,


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章