目錄索引:1.概念php
2.安裝並使用memcachedmysql
3.對memcached進行curd操做linux
4.用memcache擴展操做Memcachedc++
5.memcached機制深刻理解算法
6.memcache的細節sql
1.概念數據庫
Memcached是一個高性能的分佈式的內存對象緩存系統,目前全世界很多人使用這個緩存項目來構建本身大負載的網站,來分擔數據庫的壓力,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。相關網站:http://danga.com/ http://memcached.orgapache
2.安裝並使用memcachedwindows
(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中。
到這,時間再完善.....