Memchache 總結

Memcache簡介

memcache是一個高性能的分佈式的內存對象緩存系統,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視 頻、文件以及數據庫檢索的結果等。Memcache是danga.com的一個項目,最先是爲 LiveJournal 服務的,最初爲了加速 LiveJournal 訪問速度而開發的,後來被不少大型的網站採用。目前全世界很多人使用這個緩存項目來構建本身大負載的網站,來分擔數據庫的壓力。起初做者編寫它多是爲了 提升動態網頁應用,爲了減輕數據庫檢索的壓力,來作的這個緩存系統。它的緩存是一種分佈式的,也就是能夠容許不一樣主機上的多個用戶同時訪問這個緩存系統, 這種方法不只解決了共享內存只能是單機的弊端,同時也解決了數據庫檢索的壓力,最大的優勢是提升了訪問獲取數據的速度!基於memcache和對分佈式 cache的理解和解決方案。 memcache徹底能夠用到其餘地方 好比分佈式數據庫, 分佈式計算等領域。php

接口介紹html

Memcache客戶端包含兩組接口,一組是面向過程的接口,一組是面向對象的接口,具體能夠參考PHP手冊 「LXXV. Memcache Functions」 這章。
Memcache面向對象的經常使用接口包括:
Memcache::connect -- 打開一個到Memcache的鏈接
Memcache::pconnect -- 打開一個到Memcache的長鏈接
Memcache::close -- 關閉一個Memcache的鏈接
Memcache::set -- 保存數據到Memcache服務器上
Memcache::get -- 提取一個保存在Memcache服務器上的數據
Memcache::replace -- 替換一個已經存在Memcache服務器上的項目(功能相似Memcache::set)
Memcache::delete -- 從Memcache服務器上刪除一個保存的項目
Memcache::flush -- 刷新全部Memcache服務器上保存的項目(相似於刪除全部的保存的項目)
Memcache::getStats -- 獲取當前Memcache服務器運行的狀態前端

Memcache在中型網站的使用web

   使用Memcache的網站通常流量都是比較大的,爲了緩解數據庫的壓力,讓Memcache做爲一個緩存區域,把部分信息保存在內存中,在前端可以迅 速的進行存取。那麼通常的焦點就是集中在如何分擔數據庫壓力和進行分佈式,畢竟單臺Memcache的內存容量的有限的。我這裏簡單提出個人我的見解,未 經實踐,權當參考。
[ 分佈式應用]
Memcache原本支持分佈式,咱們客戶端稍加改造,更好的支持。咱們的key能夠適當進行 有規律的封裝,好比以user爲主的網站來講,每一個用戶都有User ID,那麼能夠按照固定的ID來進行提取和存取,好比1開頭的用戶保存在第一臺Memcache服務器上,以2開頭的用戶的數據保存在第二胎 Mecache服務器上,存取數據都先按照User ID來進行相應的轉換和存取。
可是這個有缺點,就是須要對User ID進行判斷,若是業務不一致,或者其餘類型的應用,可能不是那麼合適,那麼能夠根據本身的實際業務來進行考慮,或者去想更合適的方法。
[ 減小數據庫壓力]
這個算是比較重要的,全部的數據基本上都是保存在數據庫當中的,每次頻繁的存取數據庫,致使數 據庫性能極具降低,沒法同時服務更多的用戶,好比MySQL,特別頻繁的鎖表,那麼讓Memcache來分擔數據庫的壓力。咱們須要一種改動比較小,並 且可以不會大規模改變前端的方式來進行改變目前的架構。sql

Memcache的安全
咱們上面的Memcache服務器端都是直接經過客戶端鏈接後直接操做,沒有任何的驗證過程,這樣若是服務器是直接暴露在互聯網上的話是比較危險,輕則數 據泄露被其餘無關人員查看,重則服務器被***,由於Mecache是以root權限運行的,何況裏面可能存在一些咱們未知的bug或者是緩衝區溢出的情 況,這些都是咱們未知的,因此危險性是能夠預見的。爲了安全起見,我作兩點建議,可以稍微的防止***的***或者數據的泄露。數據庫

內網訪問
最好把兩臺服務器之間的訪問是內網形態的,通常是Web服務器跟Memcache服務器之間。廣泛的服務器都是有兩塊網卡,一塊指向互聯網,一塊指向內 網,那麼就讓Web服務器經過內網的網卡來訪問Memcache服務器,咱們Memcache的服務器上啓動的時候就監聽內網的IP地址和端口,內網間的 訪問可以有效阻止其餘非法的訪問。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache服務器端設置監聽經過內網的192.168.0.200的ip的11211端口,佔用1024MB內存,而且容許最大1024個併發鏈接緩存

設置防火牆
防火牆是簡單有效的方式,若是倒是兩臺服務器都是掛在網的,而且須要經過外網IP來訪問Memcache的話,那麼能夠考慮使用防火牆或者代理程序來過濾非法訪問。
通常咱們在Linux下可使用iptables或者FreeBSD下的ipfw來指定一些規則防止一些非法的訪問,好比咱們能夠設置只容許咱們的Web服務器來訪問咱們Memcache服務器,同時阻止其餘的訪問。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT
上面的iptables規則就是隻容許192.168.0.2這臺Web服務器對Memcache服務器的訪問,可以有效的阻止一些非法訪問,相應的也能夠增長一些其餘的規則來增強安全性,這個能夠根據本身的須要來作安全

Memcache的使用方法:

有兩種方法可使 PHP 做爲 memcached 客戶端,調用 memcached 的服務進行對象存取操做。服務器

第一種,PHP 有一個叫作 memcache 的擴展,Linux 下編譯時須要帶上 –enable-memcache[=DIR] 選項,Window 下則在 php.ini 中去掉 php_memcache.dll 前邊的註釋符,使其可用。架構

除此以外,還有一種方法,能夠避開擴展、從新編譯所帶來的麻煩,那就是直接使用 php-memcached-client

建議使用第一種辦法,雖然有增長php擴展 從新編譯php的麻煩。 但一勞永逸,程序不用再包含一個文件,執行時候不用在經過解析器解析代碼。 效率比第二種高不少。

程序應用中須要注意

如今狀況是db層和web層之間有一橋樑 memcache程序之間。 但不能由於這而徹底中斷db 和web之間的聯繫。 Web 和db之間 要有一個曲線。 即沒法使用memecache的時候兩者相互通訊。

實現很簡單:

例如:

$sql="SELECT count(tid) as num FROM pw_blog b WHERE $where";

if(!$memcache->get(md5($sql))){

$count = $db->get_one($sql);

$sum=$count['num'];

$memcache->set(md5($sql), $sum, false, 300000);

}else{

$sum=$memcache->get(md5($sql));

}

而不要寫成:

$sql="SELECT count(tid) as num FROM pw_blog b WHERE $where";

if(!$memcache->get(md5($sql))){

$count = $db->get_one($sql);

$sum=$count['num'];

$memcache->set(md5($sql), $sum, false, 300000);

}

$sum=$memcache->get(md5($sql));

這樣的形式,這樣 db和web就無路可通了。

關於memcache的內存使用

memcached默認狀況下采用了名爲Slab Allocator的機制分配、管理內存。

Slab Allocator的基本原理是按照預先規定的大小,將分配的內存分割成特定長度的塊,以徹底解決內存碎片問題。

Slab Allocation的原理至關簡單。 將分配的內存分割成各類尺寸的塊(chunk),並把尺寸相同的塊分紅組(chunk的集合).

memcached根據收到的數據的大小,選擇最適合數據大小的slab。 memcached中保存着slab內空閒chunk的列表,根據該列表選擇chunk,而後將數據緩存於其中。

memcached不會釋放已分配的內存。記錄超時後,客戶端就沒法再看見該記錄(invisible,透明),其存儲空間便可重複使用

memcached內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過時。這種技術被稱爲lazy(惰性)expiration。所以,memcached不會在過時監視上耗費CPU時間

memcached會優先使用已超時的記錄的空間,但即便如此,也會發生追加新記錄時空間不足的狀況,此時就要使用名爲 Least Recently Used(LRU)機制來分配空間。顧名思義,這是刪除「最近最少使用」的記錄的機制。所以,當memcached的內存空間不足時(沒法從slab class 獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。

此處還有一個參數: M ,不是m

啓動時候參數 -m 用來申請內存空間 -M 倒是禁止LRU的。

-M 參數使用在內存用慢的時候會返回錯誤。 原本咱們不是把memcached用作存儲,而是用作緩存,因此推薦使用LRU。

相關文章
相關標籤/搜索