目錄索引:1.概念
? ? ? ? ? ? ? 2.安裝并使用memcached
? ? ? ? ? ? ? 3.對(duì)memcached進(jìn)行curd操作
????????????? 4.用memcache擴(kuò)展操作Memcached
????????????? 5.memcached機(jī)制深入理解
????????????? 6.memcache的細(xì)節(jié)
1.概念
Memcached是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng),目前全世界不少人使用這個(gè)緩存項(xiàng)目來(lái)構(gòu)建自己大負(fù)載的網(wǎng)站,來(lái)分擔(dān)數(shù)據(jù)庫(kù)的壓力,通過(guò)在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨大的hash表,它能夠用來(lái)存儲(chǔ)各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫(kù)檢索的結(jié)果等。簡(jiǎn)單的說(shuō)就是將數(shù)據(jù)調(diào)用到內(nèi)存中,然后從內(nèi)存中讀取,從而大大提高讀取速度。相關(guān)網(wǎng)站: http://danga.com/ ? http://memcached.org
2.安裝并使用memcached
(1).下載memcached軟件
(2).運(yùn)行cmd命令,切換到memcached.exe目錄,運(yùn)行memecache.exe -d install
(3).啟動(dòng)memcached
第一種方法:到【控制面板/服務(wù)】里啟動(dòng)
第二種方法:cmd到memcached目錄,運(yùn)行memcached.exe -d start
(4)用netstat -an查看11211端口是否在監(jiān)聽(tīng),如果在監(jiān)聽(tīng),說(shuō)明啟動(dòng)成功。
(補(bǔ)充:1.用netstat -anb可以看11211端口是哪個(gè)程序在監(jiān)聽(tīng),同時(shí)可以看到那些用戶連接到我們的服務(wù)器 2.有名的端口1-1024 apache:80 mysql:3306 ftp:21 ssh:22 oracle:1521 stmp:25)
3.使用telnet連接到memcached服務(wù)
telnet 127.0.0.1 11211
如果不能使用telnet命令,拷貝一個(gè)telnet.exe放到c:/windows/system32就OK。
(1) 增加
基本語(yǔ)法:add key名 0 (存放時(shí)間)數(shù)據(jù)大小
例:add key1 0 30 5
hello
(2)獲取
基本語(yǔ)法:get key名
例:get key1
(3)修改
方式1:set key名 0 存放時(shí)間 數(shù)據(jù)大小
方式2:replace key名 0 存放時(shí)間 數(shù)據(jù)大小
例:set key100 0 70 6
ssssss
(4)刪除
基本語(yǔ)法:delete key名
例:delete key300
(補(bǔ)充:1.查看狀態(tài)stats 命中率cmd_set/cmd_get 2.清空內(nèi)存數(shù)據(jù)flush_all 3.操作Memcached命令: http://wenku.baidu.com/link?url=2roCXD80HRkrRZ9prNXvTOeI15Tl4-w8l-JoJUmzti0S_Mp0EQJwaouiYOoIK0-1zT2CZHN54XehrUFo6r9W8Aqka4NQ4LmcuWeLoqZ17sa )
4.用memcache擴(kuò)展操作Memcached
(1)安裝配置
①拷貝一個(gè)php_memcache.dll至php的ext目錄
②在php.ini開(kāi)啟php_memcache.dll擴(kuò)展
③重啟apache
(2)操作
代碼:
1 // 連接memcache服務(wù)器 2 $mem = new Memcache(); 3 if (! $mem ->connect('localhost',11211 )) { 4 die ('connect error!' ); 5 } 6 // 增加 7 if ( $mem ->set('key1','val1',MEMCACHE_COMPRESSED,60 )) { 8 echo 'add ok!' ; 9 } 10 $arr = array ('moushu','yunshu' ); 11 if ( $mem ->set('arr', $arr ,MEMCACHE_COMPRESSED,60 )) { 12 echo 'add ok!' ; 13 } 14 class Dog { 15 public $name ; 16 public $age ; 17 } 18 $dog = new Dog(); 19 if ( $mem ->set('dog', $dog ,MEMCACHE_COMPRESSED,60 )) { 20 echo 'add ok!' ; 21 } 22 $null_val = null ; 23 if ( $mem ->set('null_val', $null_val ,MEMCACHE_COMPRESSED,60 )) { 24 echo 'add ok!' ; 25 } 26 $bool_val = null ; 27 if ( $mem ->set('bool_val', false ,MEMCACHE_COMPRESSED,60 )) { 28 echo 'add ok!' ; 29 } 30 $handle = fopen ('2.php','a' ); 31 if ( $mem ->set('res', $handle ,MEMCACHE_COMPRESSED,60 )) { 32 echo 'add res ok!' ; 33 } 34 if ( $mem ->set('name','luoyunshu',MEMCACHE_COMPRESSED,30*3600*24 )) { 35 echo 'add name ok!' ; 36 } // 存儲(chǔ)30天 37 if ( $mem ->set('name2','moushu',MEMCACHE_COMPRESSED, time ()+31*3600*24 )) { 38 echo 'add name2 ok!' ; 39 } // 存儲(chǔ)31天 40 41 //修改 42 if ( $mem ->replace('key1','hello',MEMCACHE_COMPRESSED,60 )) { 43 echo 'add ok!' ; 44 } 45 46 // 刪除 47 if ( $mem ->delete('key1' )) { 48 echo 'del ok!' ; 49 } 50 51 // 查詢 52 $val = $mem ->get('key1' ); 53 echo $val ; 54 $val = $mem ->get('arr' ); 55 var_dump ( $val ); 56 $dog = $mem ->get('dog'); // 取對(duì)象時(shí)要先聲明類定義 57 var_dump ( $dog ); 58 $null_val = $mem ->get('null_val' ); 59 var_dump ( $null_val ); // null 60 $bool_val = $mem ->get('bool_val' ); 61 var_dump ( $bool_val ); // '' 62 $res = $mem ->get('res' ); 63 var_dump ( $res ); // 0 64 $res = $mem ->get('key1' ); 65 var_dump ( $res ); 66 $name = $mem ->get('name' ); 67 var_dump ( $name ); 68 $name2 = $mem ->get('name2' ); 69 var_dump ( $name2 ); // moushu
?5.memcached機(jī)制深入理解
(1)基于c/s架構(gòu) ,協(xié)議簡(jiǎn)單
?● c/s架構(gòu),此時(shí)memcached為服務(wù)器端,我們可以使用如PHP,c/c++等程序連接memcached服務(wù)器。
?● memcached的服務(wù)器客戶端通信并不使用XML等格式,而使用簡(jiǎn)單的基于文本行的協(xié)議。因此,通過(guò)telnet也能在memcached上保存數(shù)據(jù)、取得數(shù)據(jù)
?(2)基于libevent的事件處理
?● libevent是一套跨平臺(tái)的事件處理接口的封裝,能夠兼容包括這些操作系統(tǒng): Windows/Linux/BSD/Solaris 等操作系統(tǒng)的的事件處理。
?● Memcached 使用libevent來(lái)進(jìn)行網(wǎng)絡(luò)并發(fā)連接的處理,能夠保持在很大并發(fā)情況下,仍舊能夠保持快速的響應(yīng)能力。
?(3)內(nèi)置內(nèi)存存儲(chǔ)方式
?● 為了提高性能,memcached中保存的數(shù)據(jù)都存儲(chǔ)在memcached內(nèi)置的內(nèi)存存儲(chǔ)空間中。由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟memcached、重啟操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。另外,內(nèi)容容量達(dá)到指定值之后,就基于LRU(Least Recently Used)算法自動(dòng)刪除不使用的緩存。memcached本身是為緩存而設(shè)計(jì)的服務(wù)器,因此并沒(méi)有過(guò)多考慮數(shù)據(jù)的永久性問(wèn)題。
?(4)基于客戶端的分布式
?● memcached盡管是“分布式”緩存服務(wù)器,但服務(wù)器端并沒(méi)有分布式功能。各個(gè)memcached不會(huì)互相通信以共享信息。
代碼:
1 // 連接memcache服務(wù)器,啟動(dòng)兩個(gè)服務(wù)器 (memcached.exe -p 9999 2 $mem = new Memcache(); 3 if (! $mem ->addServer('localhost',11211 )) { 4 die ('connect server1 error!' ); 5 } // serv1 6 if (! $mem ->addServer('localhost',9999 )) { 7 die ('connect server2 error!' ); 8 } // serv2 9 10 //將數(shù)據(jù)放入哪個(gè)memcache服務(wù)器,由客戶端的mem對(duì)象決定 11 //當(dāng)執(zhí)行addServer的時(shí)候,并不是立即去連接mem服務(wù),而是通過(guò)計(jì)算,hash后采取決定連接哪個(gè)mem服務(wù),因此當(dāng)你大量加入服務(wù)器到連接池時(shí)并沒(méi)有多余的開(kāi)銷。 12 if ( $mem ->set('key1','val1',MEMCACHE_COMPRESSED,120 )) { 13 echo 'add key1 ok!' ; 14 } // 放在serv1 15 if ( $mem ->set('key2','val2',MEMCACHE_COMPRESSED,120 )) { 16 echo 'add key2 ok!' ; 17 } // 放在serv2 18 if ( $mem ->set('key3','val3',MEMCACHE_COMPRESSED,120 )) { 19 echo 'add key3 ok!' ; 20 } // 放在serv1 21 22 $res1 = $mem ->get('key1' ); 23 $res2 = $mem ->get('key2' ); 24 $res3 = $mem ->get('key3' ); 25 echo $res1 ; 26 echo $res2 ; 27 echo $res3 ;
?6.memcache的細(xì)節(jié)
(1)生命周期
?從數(shù)據(jù)放入memcache開(kāi)始計(jì)時(shí),直到時(shí)間到了,就銷毀,如果時(shí)間為0,則表示不過(guò)期。memcache的數(shù)據(jù)被銷毀情況有:1.時(shí)間到了 ②重啟memcached服務(wù) ③delete掉了
?(2)將 session數(shù)據(jù) 放入 memcached 中
??? ①.配置:
??? 第一種方法:修改php.ini 文件,修改如下:
????? save-handler=memcache
???? session.save_path?=?"tcp://localhost:11211"
??? 第二種方法,使用ini_set()
??? ini_set('session.save_handler','memcache');
??? ini_set('session.save_path','tcp://localhost:11211');
??? 一些說(shuō)明: memcached 主要的目的是提速,數(shù)據(jù)不和用戶綁定(session數(shù)據(jù)存入memcache中以session id作為鍵值,任何可訪問(wèn)memcache的人都可以取到值)。 session 數(shù)據(jù)和用戶綁定,更安全。
?(3) memcached 安全性
?? 通過(guò)啟用防火墻來(lái)防止外網(wǎng)訪問(wèn) memcached 服務(wù),保證 memcached 的安全。 linux系統(tǒng)設(shè)置防火墻的命令:iptables?-a?input?-p?tcp?-s?127.0.0.1?-dport?11211?-j?ACCEPT
?(4)樣的數(shù)據(jù)適合放入 memcache 中?
?? 變化頻繁,具有不穩(wěn)定的數(shù)據(jù),不需要實(shí)時(shí)入庫(kù)(比如用戶在線狀態(tài)、在線人數(shù) .... ),想加快用戶訪問(wèn)應(yīng)用的速度。大數(shù)據(jù),如圖片、視頻不適合放入memcache中。
? 到這,時(shí)間再完善.....
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
