Memcache php
(1)memcached是一個高性能的分佈式的內存對象緩存系統,是爲了解決大型網站的提速而設計的一個軟件,主要緩存中間結果的數據。mysql
(2)Memcached是danga的一個項目,最先是LiveJournal 服務的,最初爲了加速 LiveJournal 訪問速度而開發的,後來被不少大型的網站採用。 官方網站: www.danga.com 和 memcached.orglinux
減小數據庫訪問,提升Web速度算法
實質:不用去請求讀取mysql,減小mysql的併發量和讀寫量。sql
(1)與mysql同樣,是一個c/s架構的軟件。數據庫
(2)mysql裏面的數據,是存儲到磁盤裏面的,memcache裏面的數據是存儲到內存裏面的,一旦斷電,服務器重啓,則會丟失數據。apache
(3)要使用mysql則先要建立數據庫,再建立表,以及表結構。在memcache裏面數據的存儲是鍵值對。能夠理解成兩列的表, key與value緩存
name 小剛安全
age 12服務器
email xiaogagn@sohu.com
方式一:直接使用,無需安裝,(在開發時推薦使用)
(1)下載軟件,把軟件拷貝到指定位置,通常和其餘的安裝軟件(好比apache等)在同級目錄下面,主要是便於管理。
(2)以cmd的方式,運行memcache
進入到memcached.exe文件所在的目錄,
幫助命令:Memcached –h
開始cmd方式,運行memcache軟件。、
啓動後,該窗口不要關閉,一旦關閉,則服務就中止了。
方式二:把 memcahce安裝成window的一個服務,(在生產環境中推薦使用)
經過查看memcached 的幫助。
注意:在把 memcache安裝成window的一個服務時,要以管理員的方式啓動cmd.
查看服務是否安裝成功:
安裝可能失敗的緣由:
(1) 若是你是用win7,win8系統,他對安全性要求高,所以,須要你們使用管理員的身份來安裝和啓動. 具體是 程序開始===>全部程序==》附件==》cmd(單擊右鍵,選擇以管理員的身份來執行)
(2)存放memcached.exe 目錄不要有中文或者特殊字符
(3)安裝成功,可是啓動會報告一個錯誤信息,提示缺乏xx.dll ,你能夠從別的機器拷貝該dll文件,而後放入到system32下便可.
此時須要一個能夠與memcached服務器通訊的客戶端程序。該客戶端程序只要可鏈接上服務器,並向其發送簡單的文本指令便可。
典型的,telnet遠程登陸協議,
在cmd中 telnet IP地址 端口號
無需用戶名和密碼,沒有認證機制。
注意:telnet客戶端沒法使用的解決方案:
解決方案以下:
(1) 打開控制面板,選擇卸載程序
(2)選擇‘啓用或關閉window功能’
(3)在彈出的窗口中,選擇telnet客戶端,前面勾上對勾便可。
修改完畢後,再次使用telnet localhost 8888 鏈接,會彈出以下指令,則表示鏈接成功。
(1)添加數據,
語法:add key 是否壓縮(0|1) 緩存時間 數據的長度
key :鍵的名稱
是否壓縮:0表示不壓縮,1表示要壓縮,壓縮的目的讓數據變小,存儲更多的數據。
緩存時間:失效時間,表示過了該時間數據就失效。
數據的長度:單位是字節,
注意:在使用add添加數據時,若是該鍵已經存在,則添加失敗,不會覆蓋。
z
(2)修改數據
replace key 0|1 緩存時間 數據的長度
注意:若是鍵不存在,則修改失敗。
(3)設置數據
set key 0|1 緩存時間 數據長度
注意:若是鍵已經存在,則是修改,若是鍵不存在,則是添加。
語法:delete key
flush_all 是刪除全部的緩存項
incr 增長指定的值
語法:incr key number
decr 減小指定的值
好比有1000件商品,須要在60秒內搶購。
一開始就設置number的值爲1000 ,當用戶搶購時執行decr number ,若是執行後返回的值大於0則說明搶購成功,
stats
經過查看狀態的參數,主要是計算命中率,
get_hits/cmd_get ====得出一個命中率,命中率越高越好,若是命中率比較低,則須要調整緩存項。
緩存週期有兩種設置方式:
(1)時間間隔(秒數)
(2)到期的時間戳,必須大於當前的時間戳纔有效。
思考:時間間隔和到期的時間戳都是整數,如何區分是時間戳仍是時間間隔。
若是使用時間間隔,則不能超過 2592000秒(30天)。
若是緩存時間小於2592000秒則是時間間隔,若是大於此值,小於當前的時間戳,則設置無效。
案例1:好比咱們想要設置緩存時間爲10天,如何設置
設置方式有兩種:
(1)時間間隔10*24*3600秒
(2)到期的時間戳:time()+10*24*3600
案例2:好比咱們想要設置緩存時間爲40天,如何設置,
只能使用到期的時間戳
time()+40*24*3600
注意:若是此值設置爲0代表此數據永不過時
好比以下測試,設置一個時間間隔大於2592000;
php做爲客戶端操做memcached
注意:
PHP鏈接memcached服務器,須要引入相應的擴展才行.在window下php-memcache.dll
注意:在window下找相應的dll時要很是當心.
須要考慮:
l php版本
l ts or nts
l vc6 or vc9
能夠經過phpinfo函數來查看PHP的環境,是ts的仍是nts,是vc幾編譯的。
(1)把memcached的擴展拷貝到的ext目錄下。
要注意:php的版本不一樣,則使用的擴展不一樣。
(2)打開php.ini文件引入擴展
(3)測試查看,使用phpinfo函數
該擴展提供的一套oop的程序,參考php手冊
提供了OOP語法,管理memcached服務器:
鏈接memcache
$mem = new Memcache();
$mem->connect(‘ip地址’,’端口’);
設置:
$memcache->add(鍵, 值, 是否壓縮, 有效期);//若是鍵已經存在,則添加失敗,不會覆蓋掉。
$memcache->replace(鍵, 值, 是否壓縮, 有效期);
$memcache->set(鍵, 值, 是否壓縮, 有效期);
$memcache->increment(鍵,步長);
$memcache->decrement(鍵,步長);
獲取:
$memcache->get(key);
刪除:
$memcache->delete(key);刪除某個鍵
$memcache->flush(void);刪除所有鍵
關閉鏈接:
$memcache->close();
效果以下;
探討php中有哪些數據類型能夠添加到memcache中。
兩大類:
標量和非標量
標量數據存儲案例
效果以下;
黑窗口裏面獲取數據,
總結:標量則將其內容轉換成字符串進行存儲。
非標量數據存儲;
獲取數據
效果以下;
-
非標量:序列化後再存儲到memcached服務器中,保存數據原有類型,獲取數據時,再反序列化。
注意:資源類型不能被合理的序列化。
注意:序列化與反序列化的工做在,memcached客戶端,set和get方法中完成的,咱們無需手動序列化。
is_scalar()能夠判斷是不是標量類型。
什麼是序列化?
就是在保存數據時,不但保存數據自己,還保存數據類型。
(1)利於在網絡間進行數據傳輸。
(2)便於從新讀取並恢復數據。
想把一個sql語句的執行結果,給緩存到memcache裏面。
要注意說明的,sql語句執行的結果數據要小於1MB。
在mecache 裏面,鍵與值是有要求的,
鍵的長度要小於250字節。
數據值的大小要小於1MB。
思路:
第一次訪問時經過sql取出一些數據,把sql語句取出的數據添加到memcache緩存中。
第二次訪問,先判斷memcache裏面有沒有數據,有直接返回,若沒有則從數據庫裏面取出。
分兩步:
(1)初始化memcache
S(array(
‘type’=>’memcache’,
‘host’=>’ip地址’,
‘port’=>端口號
));
(2)具體的操做
獲取數據;
$data = S(key);
設置數據:
S(key,value,失效時間);
清空數據:
S(key,null)
添加數據操做
獲取數據操做
刪除數據操做
分佈式部署:要架設多臺memcache服務器支撐業務的發展,這樣每臺服務器承擔的工做就會少一些,總體上memcache服務器性能就有所提升
如今以下有問題,
php須要思考哪一個key存儲到哪一個服務器裏邊,php還須要思慮從哪一個服務器讀取一個指定的key出來----算法。
一個分佈式的memcached服務器集羣,由兩部分組成,
第一:多臺memcached服務器 第二:分佈式算法(內置的,咱們無需干預)
原理圖:
實現原理
分佈式算法由memcache客戶端來實現,由php提供的memcached擴展來實現。算法都是內置的,無需咱們參與。
利用key,來肯定當前數據在哪臺memcache服務器中進行存儲。
開啓不一樣的端口,來模擬兩臺memcache服務器。
開啓第一臺:
開啓第二臺
注意:使用$memcache->addServer()方法,能夠添加多臺memcached服務器的目的
具體的代碼
取出數據的代碼
(1)打開php.ini文件,配置session文件的存儲方式
session.save_handler = files [user|memcache],
(2)session文件的存儲路徑,多個用逗號隔開。
session.save_path,tcp://127.0.0.1:11211
配置完要重啓apache
(3)具體的代碼完成,常規使用session便可。
注意:可使用ini_set()函數完成,在當前頁面有效:
ini_set(‘session.save_handler’,’memcache’)
ini_set(‘session.save_path’,’tcp://127.0.0.1:11211’)
設置數據
注意:使用session的方式和之前是同樣的。
取出的數據
session信息存儲到memcache裏面是以sessionid爲鍵的,失效時間與session相同的。
(1)安全性不是很高的數據,丟失無所謂的數據,由於memcache服務器,一旦重啓或關機,則會丟失全部的數據。
(2)查詢比較頻繁,改動週期比較長的數據,好比熱點新聞,等等。
(3)一個鍵值,數據量不要很大,要小於1MB的數據。
memcache自己沒有提供任何的認證機制。
若是須要請求鏈接限制,須要使用操做系統上的限制。
經過防火牆,iptables,selinux
常規的memcached服務器,是運行在內網中的,不是公網。
除此以外:
-l 表示當前memcache服務器,監聽的哪一個ip地址的請求。在有多個有效ip的狀況下,僅僅監聽哪一個ip進來的請求。
-l後的參數僅僅能夠設置爲本身服務器存在的真實ip
在memcache裏面數據過時後,不會自動刪除,當get時,發現過時後,才刪除該數據。
Lazy Expiration
memcached內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過
期。這種技術被稱爲lazy(惰性)expiration。
所以,memcached不會在過時監視上耗費CPU時間。
LRU,least Recently Used,最近最少使用原則。
memcache在插入新數據時,若是空間不足時,採用刪除舊緩存項策略,刪除最不活躍的緩存項。