標籤:
首先確保你的伺服器環境已經具備了memcached和lamp,關於在Linux上搭建memcahced+php環境可以參考我的另外一篇文章
( http://www.cnblogs.com/codeAB/p/5591118.html )
在往下看之前你應該帶著這幾個疑問。
{ memcached 能解決什麼問題 }{ 現在比較熱議的一個話題 radis替代memcached }
{ 什麼情況下適合使用memcached }{ memcached基本用法 }{ 利用memcached構建分布式緩衝系統 }
(1)舉個例子,論壇裡面的前面幾條都是精華帖,訪問量最大。一個文章包括[文章本文.評論.點贊.訪問次數...],我們來類比一下資料,一個文章一天訪問100萬次,評論10萬次,點贊50萬次。如果所有操作都直接與mysql相連,那麼至少要執行多少次資料庫查詢?
(文章100萬次-讀 ,評論10萬次-寫,點贊50萬次-寫),一篇文章一天至少就要執行160萬次資料庫操作,現在我們使用memcached來緩解mysql壓力,
當第一個使用者訪問這個貼子後就將資料緩衝到memcached中,緩衝包括貼子本文,評論(通常只需要緩衝最近的幾十條評論),點贊次數,這樣第二個人點擊
這篇文章的時候,直接從memcached中擷取資料返回,有新評論後將評論資料更新到memcached中,點贊也是直接更新memcached,甚至文章內容被發行者修改後
也可以直接修改memcached中的內容,都不用去動資料庫,所有的更新和讀取都在memcached中完成,也就是說從之前的一片文章一天160萬次資料庫操作變成了一次!!只要你的伺服器不斷電,那麼資料可以持續一個月,一個月一篇文章從4800萬次資料庫操作 ---> 變成1次 。 當然這裡得出的結論1次是不對的,由於memcached的最大緩衝時間是30天,如果中途伺服器斷電,那麼資料會全部丟失,所以在剛剛這個例子中,對於評論的增加和文章內容的修改,這些變動最終還是要拿到資料庫裡面存好,所以我建議可以使用定時器( Linux contrab ) 每隔幾分鐘就把最新的memcahced資料同步到資料庫,就算伺服器斷電了,也只丟失幾分鐘的資料,也是可以接受的,當然伺服器無緣無故斷電這種機率是非常微乎其微的。
我想通過上面的例子對比你應該看出了memcached能解決什麼問題了。主要用來緩解資料庫壓力。
(2) 現在很多人議論或者已經在實踐中用radis(泛指nosql)用來替換memcached了,這裡我就不長篇大論去說二者的差異了,你可以搜尋相關文章資料,
撿幾個重點說,memcached的目標就是做緩衝,為了緩解資料庫壓力誕生的,而radis的目標是做一個資料庫的替換方案,這貨是建立在記憶體上的資料庫,memcached斷電後資料全部丟失(可以用定時器做持久化),radis是持久化的資料庫,最重要的一點來了:memcached單一輕量,部署簡單,多線程分布式的,radis比較吃配置,且是單線程的,看得出在做大型分布式緩衝系統的時候memcached更方便安全,
google和facebook這些大佬都在用memcached,而國內用radis的也比較多。最後我們在看一下第一點目標的差異,一個是緩解資料庫壓力的,一個是用來替代傳統關聯式資料庫的nosql,
也就是說memcached和radis並不是競爭關係,甚至兩者是可以協同工作的,radis做為資料庫,memcached作為中間緩衝系統,緩解radis負載量,最後我希望
你也去學習一下nosql的相關知識,一種高效能記憶體資料庫,我相信這是未來資料庫發展的一個方向!
(3)memcached本身用法都很簡單,我相信你花10分鐘看一遍官方文檔就知道每個方法有什麼作用了,但是看完過後是不是一臉茫然?
在那些情況適合使用memcached? 首先不同的網站不同的情境下沒有一個固定的規律,memcached的目標是什嗎? 緩解資料庫壓力。
那麼根據你自己的網站分析,找到訪問量大資料變更少,我們去看看網易雲音樂網站,看看那些地方memcached可以派上用場。
開啟首頁看到中間部分是熱門推薦1,這個地方的推薦大概幾分鐘至幾十分鐘都是不變的,訪問量非常大,隨便點擊
一個推薦進去看到2,
包含了這個專輯建立的一些資訊介紹,還有就是裡麵包含的歌曲列表資訊,使用者評論等,
可以看到列表右上方當前播放次數是16萬次,也就是16萬次讀資料庫(還不包括評論和專輯的一些統計資訊更新),利用memcached,在第一個使用者請求了這個頁面後就緩衝進memcached中,
以後的使用者請求就直接走memcached了,利用memcached的讓16萬次讀資料庫降到1次!! ,
評論和專輯的統計資訊這裡也可以走memcached,然後定時同步到資料庫,大大降低資料庫負載量。
(4)
用法很簡單,隨便舉個例子,更多函數方法請查看php官方手冊
$m = new Memcached();
$m->addServer(‘localhost‘, 11211);
$m->flush();
$m->add("key1","value1");
class People {
function __construct($name) {
$this->name = $name;
}
function getname() {
return $this->name;
}
}
$p = new People("Tom");
$s = serialize($p);
$m->add("dd",$s);
echo unserialize($m->get("dd"))->getname();
echo "<br>".$m->get("key1");
(5)
$m = new Memcached();
$servers = array(
// 第三個參數是權重,資料會隨機插入到一個memcached伺服器中,權重越大被使用的機率越大
array(‘192.168.150.130‘, 11211, 20),
array(‘192.168.150.131‘, 11211, 30)
array(‘192.168.150.133‘, 11211, 50)
);
// 三個主機之間通常在一個機房內,三個機子使用區域網路連通,當然這不是必須的,原則上只要三台機子能互連就行
$m->addServers($servers);
$m->flush();
$m->add("key1","value1");
// 其他動作和上面的例子一樣了
Memcached+PHP+Mysql+Linux 實踐