PHP中的Memcache基礎知識
導語:memcache是一套分佈式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著。以下的是本站小編蒐集的PHP中的Memcache基礎知識
PHP的Memcache
< ?php
//連接
$mem = new Memcache;
$mem->connect(“″, 12000);
//保存數據
$mem->set(‘key1′, ‘This is first value’, 0, 60);
$val = $mem->get(‘key1′);
echo “Get key1 value: ” . $val .”
”;
//替換數據
$mem->replace(‘key1′, ‘This is replace value’, 0, 60);
$val = $mem->get(‘key1′);
echo “Get key1 value: ” . $val . “
”;
//保存數組
$arr = array(‘aaa’, ‘bbb’, ‘ccc’, ‘ddd’);
$mem->set(‘key2′, $arr, 0, 60);
$val2 = $mem->get(‘key2′);
echo “Get key2 value: “;
print_r($val2);
echo “
”;
//刪除數據
$mem->delete(‘key1′);
$val = $mem->get(‘key1′);
echo “Get key1 value: ” . $val . “
”;
//清除所有數據
$mem->flush();
$val2 = $mem->get(‘key2′);
echo “Get key2 value: “;
print_r($val2);
echo “
”;
//關閉連接
$mem->close();
?>
如果正常的話,瀏覽器將輸出:
Get key1 value: This is first value
Get key1 value: This is replace value
Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
Get key1 value:
Get key2 value:
程序代碼分析
初始化一個Memcache的對象:
$mem = new Memcache;
連接到我們的Memcache服務器端,第一個參數是服務器的IP地址,也可以是主機名,第二個參數是Memcache的開放的端口:
$mem->connect(“″, 12000);
保存一個數據到Memcache服務器上,第一個參數是數據的key,用來定位一個數據,第二個參數是需要保存的數據內容,這裏是一個字符串,第三個參數是一個標記,一般設置爲0或者MEMCACHE_COMPRESSED就行了,第四個參數是數據的有效期,就是說數據在這個時間內是有效的,如果過去這個時間,那麼會被Memcache服務器端清除掉這個數據,單位是秒,如果設置爲0,則是永遠有效,我們這裏設置了60,就是一分鐘有效時間:
$mem->set(‘key1′, ‘This is first value’, 0, 60);
從Memcache服務器端獲取一條數據,它只有一個參數,就是需要獲取數據的key,我們這裏是上一步設置的key1,現在獲取這個數據後輸出輸出:
$val = $mem->get(‘key1′);
echo “Get key1 value: ” . $val;
現在是使用replace方法來替換掉上面key1的值,replace方法的參數跟set是一樣的,不過第一個參數key1是必須是要替換數據內容的key,最後輸出了:
$mem->replace(‘key1′, ‘This is replace value’, 0, 60);
$val = $mem->get(‘key1′);
echo “Get key1 value: ” . $val;
同樣的,Memcache也是可以保存數組的,下面是在Memcache上面保存了一個數組,然後獲取回來並輸出
$arr = array(‘aaa’, ‘bbb’, ‘ccc’, ‘ddd’);
$mem->set(‘key2′, $arr, 0, 60);
$val2 = $mem->get(‘key2′);
print_r($val2);
現在刪除一個數據,使用delte接口,參數就是一個key,然後就能夠把Memcache服務器這個key的.數據刪除,最後輸出的時候沒有結果
$mem->delete(‘key1′);
$val = $mem->get(‘key1′);
echo “Get key1 value: ” . $val . “
”;
最後我們把所有的保存在Memcache服務器上的數據都清除,會發現數據都沒有了,最後輸出key2的數據爲空,最後關閉連接
$mem->flush();
$val2 = $mem->get(‘key2′);
echo “Get key2 value: “;
print_r($val2);
echo “
”;
Memcache的使用
使用Memcache的網站一般流量都是比較大的,爲了緩解數據庫的壓力,讓Memcache作爲一個緩存區域,把部分信息保存在內存中,在前端能夠迅速的進行存取。那麼一般的焦點就是集中在如何分擔數據庫壓力和進行分佈式,畢竟單臺Memcache的內存容量的有限的。我這裏簡單提出我的個人看法,未經實踐,權當參考。
分佈式應用
Memcache本來支持分佈式,我們客戶端稍加改造,更好的支持。我們的key可以適當進行有規律的封裝,比如以user爲主的網站來說,每個用戶都有User ID,那麼可以按照固定的ID來進行提取和存取,比如1開頭的用戶保存在第一臺Memcache服務器上,以2開頭的用戶的數據保存在第二胎Mecache服務器上,存取數據都先按照User ID來進行相應的轉換和存取。
但是這個有缺點,就是需要對User ID進行判斷,如果業務不一致,或者其他類型的應用,可能不是那麼合適,那麼可以根據自己的實際業務來進行考慮,或者去想更合適的方法。
減少數據庫壓力
這個算是比較重要的,所有的數據基本上都是保存在數據庫當中的,每次頻繁的存取數據庫,導致數據庫性能極具下降,無法同時服務更多的用戶,比如MySQL,特別頻繁的鎖表,那麼讓Memcache來分擔數據庫的壓力吧。我們需要一種改動比較小,並且能夠不會大規模改變前端的方式來進行改變目前的架構。
我考慮的一種簡單方法:
後端的數據庫操作模塊,把所有的Select操作提取出來(update/delete/insert不管),然後把對應的SQL進行相應的hash算法計算得出一個hash數據key(比如MD5或者SHA),然後把這個key去Memcache中查找數據,如果這個數據不存在,說明還沒寫入到緩存中,那麼從數據庫把數據提取出來,一個是數組類格式,然後把數據在set到Memcache中,key就是這個SQL的hash值,然後相應的設置一個失效時間,比如一個小時,那麼一個小時中的數據都是從緩存中提取的,有效減少數據庫的壓力。缺點是數據不實時,當數據做了修改以後,無法實時到前端顯示,並且還有可能對內存佔用比較大,畢竟每次select出來的數據數量可能比較巨大,這個是需要考慮的因素。
Memcache的安全
我們上面的Memcache服務器端都是直接通過客戶端連接後直接操作,沒有任何的驗證過程,這樣如果服務器是直接暴露在互聯網上的話是比較危險,輕則數據泄露被其他無關人員查看,重則服務器被入侵,因爲Mecache是以root權限運行的,況且裏面可能存在一些我們未知的bug或者是緩衝區溢出的情況,這些都是我們未知的,所以危險性是可以預見的。爲了安全起見,我做兩點建議,能夠稍微的防止黑客的入侵或者數據的泄露。
內網訪問
最好把兩臺服務器之間的訪問是內網形態的,一般是Web服務器跟Memcache服務器之間。普遍的服務器都是有兩塊網卡,一塊指向互聯網,一塊指向內網,那麼就讓Web服務器通過內網的網卡來訪問Memcache服務器,我們Memcache的服務器上啓動的時候就監聽內網的IP地址和端口,內網間的訪問能夠有效阻止其他非法的訪問。
# memcached -d -m 1024 -u root -l -p 11211 -c 1024 -P /tmp/
Memcache服務器端設置監聽通過內網的的ip的11211端口,佔用1024MB內存,並且允許最大1024個併發連接
設置防火牆
防火牆是簡單有效的方式,如果卻是兩臺服務器都是掛在網的,並且需要通過外網IP來訪問Memcache的話,那麼可以考慮使用防火牆或者代理程序來過濾非法訪問。
一般我們在Linux下可以使用iptables或者FreeBSD下的ipfw來指定一些規則防止一些非法的訪問,比如我們可以設置只允許我們的Web服務器來訪問我們Memcache服務器,同時阻止其他的訪問。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s –dport 11211 -j ACCEPT
上面的iptables規則就是隻允許這臺Web服務器對Memcache服務器的訪問,能夠有效的阻止一些非法訪問,相應的也可以增加一些其他的規則來加強安全性,這個可以根據自己的需要來做
相關文章
-
php Memcache中實現消息隊列
對於一個很大的消息隊列,頻繁進行進行大數據庫的序列化 和 反序列化,有太耗費。下面是我用PHP 實現的一個消息隊列,只需要在尾部插入一個數據,就操作尾部,不用操作整個消息隊列進行讀取,與操作。但是,這個消息隊列不是線程安 -
怎麼用PHP安裝memcached擴展筆記
在現實生活或工作學習中,大家對作文都不陌生吧,作文可分爲國小作文、中學作文、大學作文(論文)。你知道作文怎樣寫才規範嗎?下面是小編爲大家收集的故鄉的秋天作文,希望對大家有所幫助。故鄉的秋天作文1秋天的果園有着萬紫 -
php-memcache安裝方法
我們留戀校園的每一個角落,只因爲我們是它的主人,當然它也是我們青春的見證,見證着我們這一羣陽光校園的好夥伴之間的友誼。下面是本站小編給大家整理陽光校園我們是好夥伴演講稿700字,歡迎閱讀陽光校園的演講稿。陽光校 -
PHP內存緩存Memcached類實例
PHP內存緩存Memcached類,以實例形式分析了PHP內存緩存Memcached的實現方法,是php操作memcached的典型應用,非常具有實用價值,需要的朋友可以參考下。 具體實現方法如下:複製代碼 代碼如下:<?PHPclass MemcacheModel -
IBM的HACMP認證知識:HACMP的規劃
一、活動主題黃河水院旅遊系share together with girl女生主題活動二、活動背景新的學期開始了,在春天來到的時刻,爲了能夠調動同學參與活動的積極性,充分展示自己的魅力,結合本系的特色,舉辦一次關於女生的活動,希望 -
在windows系統上讓php支持memcached步驟教程
詳情步驟如下:第一步:安裝 Memcached 服務1、下載 Memcached Win32 (點我下載)2、解壓下載的文件到自定義目錄,例如(C:webservermemcached)解壓後該目錄下僅有一個 在該目錄下3、使用管理員權限運行命令行(cmd)4、安裝複製代 -
Hiphop Dance街舞基礎知識
街舞屬一種中低強度的有氧運動,有一定的瘦身功效,一個小時運動後消耗全身脂肪的作用。不可忽視哦!韓國人能把街舞當成國家三大經典舞蹈之一,是因爲能讓孩子們從小做一個德、智、體全面發展的人,做一個對社會有貢獻的人。下 -
如何啓用Apache的PHP-FPM多實例
PHP-FPM 作爲 FastCGI 進程管理器而廣爲熟知,它是 PHP FastCGI 實現的改進,帶有更爲有用的功能,用於處理高負載的服務器和網站。下面就一起來學習學習,更多內容請關注應屆畢業生網! 新功能擁有具有優雅(graceful)啓動/ -
Compare with the domestic hen and the duck英語作文
The domestic hen and the duck both belong to the bird category. They have some features in common such as wings, feet, beak, flight, nest, migration, food and eggs.The domestic hen has short wings whi -
WinXP如何安裝Apache+MySQL+PHP環境
安裝步驟:在整個wamp環境搭建中,本質的工作如下:1,配置系統對php中dll文件能默認處於調用狀態。在windos下,對dll文件系統默認處於調用狀態的,有兩種採用的方式。第一種是:把需要調用dll文件複製到C:windows system32(如果是W