【部署策略】
基於memcached的slab和dump的內存管理方式,它產生的內存碎片比較少,不須要OS去作繁雜的內存回收,因此它對CPU的佔用率那是至關的低。因此建議將它跟佔用CPU較高的WEB服務器一塊兒使用來節省成本。固然若是你有大量的廉價PC,那用來專門作memcached服務器也不錯。因爲32位操做系統中,每一個進程最多隻能使用2GB內存,因此若是你有大內存的話,能夠以daemon的方式啓動兩個以上的memcached服務,或者乾脆用64位的CPU和OS。php
【服務監控】
memcached支持分佈式機制,php經過memcache::addserver來實現該機制,它實現了若是服務器列表中的一臺down掉的時候在參數retry_interval指定的時間就不會再鏈接該服務器的機制。因此只要你在該時間段內重啓或者修復了該服務器,則不會對前端形成太大的影響。固然了,若是你一直不去重啓該服務器的話,我測試過addserver再次鏈接一臺down掉的服務器的時間將比平時延長了1秒的時間。能夠經過addserver的最後一個參數failure_callback定義一個回調函數來實現郵件通知或者短信通知管理員的功能。
若是是手工重啓,我建議將該值設置爲20分鐘。不過對於memcached進程死掉的服務器,只要從新啓動memcached,就能夠正常運行,因此採用了監視memcached進程並自動啓動的方法的效果最好。mixi推薦的工具:nagios,daemontool前端
【應用策略】
memcached主要的做用是爲減輕大訪問量對數據庫的衝擊,因此通常的邏輯是首先從memcached中讀取數據,若是沒有就從數據庫中讀取數據寫入到memcache中,等下一次讀取的時候就能夠從memcached中讀取了。但在項目中的具體應用策略(也就是哪些數據應該緩存?怎麼樣緩存?過時策略?)就是個問題了。它的一個總原則是將常常須要從數據庫讀取的數據緩存在memcached中。這些數據也分爲幾類:ios
1、常常被讀取而且實時性要求不強能夠等到自動過時的數據。例如網站首頁最新文章列表、某某排行等數據。也就是雖然新數據產生了,但對用戶體驗不會產生任何影響的場景。
這類數據就使用典型的緩存策略,設置一過合理的過時時間,當數據過時之後再從數據庫中讀取。固然你得制定一個緩存清除策略,便於編輯或者其它人員能立刻看到效果。數據庫
2、常常被讀取而且實時性要求強的數據。好比用戶的好友列表,用戶文章列表,用戶閱讀記錄等。
這類數據首先被載入到memcached中,當發生更改(添加、修改、刪除)時就清除緩存。在緩存的時候,我將查詢的SQL語句md5()獲得它的hash值做爲key,結果數組做爲值寫入memcached,而且將該SQL涉及的table_name以及hash值配對存入memcached中。當更改了這個表時,我就將與此表相配對的key的緩存所有刪除。數組
3、統計類緩存,好比文章瀏覽數、網站PV等
此類緩存是將在數據庫的中來累加的數據放在memcached來累加。獲取也經過memcached來獲取。但這樣就產生了一個問題,若是memcached服務器down掉的話這些數據就有可能丟失,因此通常使用memcached的永固性存儲,這方面咱們新浪使用memcachedb。緩存
4、活躍用戶的基本信息或者某篇熱門文章。
此類數據的一個特色就是數據都是一行,也就是一個一維數組,當數據被update時(好比修改暱稱、文章的評論數),在更改數據庫數據的同時,使用Memcache::replace替換掉緩存裏的數據。這樣就有效了避免了再次查詢數據庫。服務器
6、session數據
使用memcached來存儲session的效率是最高的。memcached自己也是很是穩定的,不太用擔憂它會忽然down掉引發session數據的丟失,即便丟失就從新登陸了,也沒啥。見[多服務器session共享之memcache共享]session
【總結】
經過以上的策略數據庫的壓力將會被大大減輕。檢驗你使用memcached是否得當的方法是查看memcached的命中率。有些策略好的網站的命中率能夠到達到90%以上。分佈式
【後記】
1、memcached暫時還不支持故障轉移,但願在之後的版本中能支持該功能。固然你可使用日本人平林幹雄的Tokyo Tyrant 來代替memcached,它支持memcached協議,支持永固性存儲和故障轉移。但我沒有在生產環境中使用過,也沒有相關的性能測試數據。之後會試用一下這個東東。
2、memcached不支持檢索的功能,在實際使用中好比咱們想把一個IP表放在memcached中,來檢索某一個IP屬於那個地區的話,有了檢索功能就方便多了。但願他在之後的版本中能提供該功能。暫時能夠經過排序存儲和二分法在客戶端實現。
3、memcached1.2.2版本確實有不穩定的狀況,有時候會出現DOWN機,強烈建議升級至1.2.6的版本。見官方說明:Version 1.2.6 released. Major crash fixes, DTrace support, minor updates. If you have stability issues with any previous release, please upgrade to this one.memcached