目錄索引:1.概念
? ? ? ? ? ? ? 2.安裝并使用memcached
? ? ? ? ? ? ? 3.對memcached進行curd操作
????????????? 4.用memcache擴展操作Memcached
????????????? 5.memcached機制深入理解
????????????? 6.memcache的細節
1.概念
Memcached是一個高性能的分布式的內存對象緩存系統,目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度。相關網站: http://danga.com/ ? http://memcached.org
2.安裝并使用memcached
(1).下載memcached軟件
(2).運行cmd命令,切換到memcached.exe目錄,運行memecache.exe -d install
(3).啟動memcached
第一種方法:到【控制面板/服務】里啟動
第二種方法:cmd到memcached目錄,運行memcached.exe -d start
(4)用netstat -an查看11211端口是否在監聽,如果在監聽,說明啟動成功。
(補充:1.用netstat -anb可以看11211端口是哪個程序在監聽,同時可以看到那些用戶連接到我們的服務器 2.有名的端口1-1024 apache:80 mysql:3306 ftp:21 ssh:22 oracle:1521 stmp:25)
3.使用telnet連接到memcached服務
telnet 127.0.0.1 11211
如果不能使用telnet命令,拷貝一個telnet.exe放到c:/windows/system32就OK。
(1) 增加
基本語法:add key名 0 (存放時間)數據大小
例:add key1 0 30 5
hello
(2)獲取
基本語法:get key名
例:get key1
(3)修改
方式1:set key名 0 存放時間 數據大小
方式2:replace key名 0 存放時間 數據大小
例:set key100 0 70 6
ssssss
(4)刪除
基本語法:delete key名
例:delete key300
(補充:1.查看狀態stats 命中率cmd_set/cmd_get 2.清空內存數據flush_all 3.操作Memcached命令: http://wenku.baidu.com/link?url=2roCXD80HRkrRZ9prNXvTOeI15Tl4-w8l-JoJUmzti0S_Mp0EQJwaouiYOoIK0-1zT2CZHN54XehrUFo6r9W8Aqka4NQ4LmcuWeLoqZ17sa )
4.用memcache擴展操作Memcached
(1)安裝配置
①拷貝一個php_memcache.dll至php的ext目錄
②在php.ini開啟php_memcache.dll擴展
③重啟apache
(2)操作
代碼:
1 // 連接memcache服務器 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 } // 存儲30天 37 if ( $mem ->set('name2','moushu',MEMCACHE_COMPRESSED, time ()+31*3600*24 )) { 38 echo 'add name2 ok!' ; 39 } // 存儲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'); // 取對象時要先聲明類定義 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機制深入理解
(1)基于c/s架構 ,協議簡單
?● c/s架構,此時memcached為服務器端,我們可以使用如PHP,c/c++等程序連接memcached服務器。
?● memcached的服務器客戶端通信并不使用XML等格式,而使用簡單的基于文本行的協議。因此,通過telnet也能在memcached上保存數據、取得數據
?(2)基于libevent的事件處理
?● libevent是一套跨平臺的事件處理接口的封裝,能夠兼容包括這些操作系統: Windows/Linux/BSD/Solaris 等操作系統的的事件處理。
?● Memcached 使用libevent來進行網絡并發連接的處理,能夠保持在很大并發情況下,仍舊能夠保持快速的響應能力。
?(3)內置內存存儲方式
?● 為了提高性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中。由于數據僅存在于內存中,因此重啟memcached、重啟操作系統會導致全部數據消失。另外,內容容量達到指定值之后,就基于LRU(Least Recently Used)算法自動刪除不使用的緩存。memcached本身是為緩存而設計的服務器,因此并沒有過多考慮數據的永久性問題。
?(4)基于客戶端的分布式
?● memcached盡管是“分布式”緩存服務器,但服務器端并沒有分布式功能。各個memcached不會互相通信以共享信息。
代碼:
1 // 連接memcache服務器,啟動兩個服務器 (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 //將數據放入哪個memcache服務器,由客戶端的mem對象決定 11 //當執行addServer的時候,并不是立即去連接mem服務,而是通過計算,hash后采取決定連接哪個mem服務,因此當你大量加入服務器到連接池時并沒有多余的開銷。 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的細節
(1)生命周期
?從數據放入memcache開始計時,直到時間到了,就銷毀,如果時間為0,則表示不過期。memcache的數據被銷毀情況有:1.時間到了 ②重啟memcached服務 ③delete掉了
?(2)將 session數據 放入 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');
??? 一些說明: memcached 主要的目的是提速,數據不和用戶綁定(session數據存入memcache中以session id作為鍵值,任何可訪問memcache的人都可以取到值)。 session 數據和用戶綁定,更安全。
?(3) memcached 安全性
?? 通過啟用防火墻來防止外網訪問 memcached 服務,保證 memcached 的安全。 linux系統設置防火墻的命令:iptables?-a?input?-p?tcp?-s?127.0.0.1?-dport?11211?-j?ACCEPT
?(4)樣的數據適合放入 memcache 中?
?? 變化頻繁,具有不穩定的數據,不需要實時入庫(比如用戶在線狀態、在線人數 .... ),想加快用戶訪問應用的速度。大數據,如圖片、視頻不適合放入memcache中。
? 到這,時間再完善.....
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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