php使用memcached

介紹:

memcached是一種緩存技術, 基於c/s模式,他可以把你的數據放入內存,從而通過內存訪問提速,因爲內存最快的, memcached技術的主要目的提速,

在memachec 中維護了一張大的hashtable表 ,該表是在內存,表的結構是

key   value

字串  (字串,數值,數組,對象,布爾,二進制數據,null)

u      安裝並使用memcached

安裝步驟

(1)   下載memcached軟件

(2)   安裝

進入cmd ,切換到 memcached.exe 文件所在目錄

memcached.exe –d install

(3)   啓動memcached

第一種,可以到服務點擊啓動

第二種, 命令行

memcached.exe –m 200MB –d start  【以deamon方式啓動,默認64M】

 

如果你在啓動時,win7啓動不成功, 則可以使用如下方法

memcached.exe –p 端口號

 

啓動方法不要關閉控制檯.

 

端口號的範圍 :0-65535  , 因爲端口號是用兩個字節來表示

有名端口: 0-1024 已經用程序使用 , apache 80  , mysql 3306 , ftp 21 , ssh 22

oracle: 1521, stmp: 25

 

使用netstat –an 如果看到 11211端口在監聽,說明啓動ok

netstat –anb 是哪個程序監聽, 這個指令還可以看到有哪些用戶連接到我們的服務器.

 

如果沒有安裝好,原因可能

1.      如果你是win7, win7對安全性高,所有,必須以adminstartor 身份來安裝.

你切換成adminstrator, 去安裝,在啓動

2.      你的memcached.exe 目錄有中文,或特殊字符, 保證目錄沒有中文和特殊字符.

 

(4)   準備研究如果對memcached進行curd操作.

 四種操作memcached的方式:

1,使用telnet 2,使用php的memcache擴展 3,使用php的memcached擴展 4,使用php的socket連接memcached服務器進行操作

 

看看telnet如何操作 (curd)

 

1.      登錄到telnet連接到 memcached服務

telnet 127.0.0.1  11211

 

如果你們不能使用telnet是因爲系統不存在telnet.exe , 就可以到其它機器上拷貝telnet.exe 放在c:\windows\system32 即可

2.      增加

基本語法是:

add key名 0 存放時間(秒) 數據大小(字符)

舉例:

add key1 0 30 5

 

3.      如何獲取

基本語法是:

get key值

get key1

4.      修改

 

set key名 0 存放時間 數據大小.

 

舉例:

set key1 0 40 5

☞ 如果key1不存在,則相當於增加新,如果存在,則相當有替換

 

replace key名存放時間 數據大小

replace key1 0 40 5

☞ 如果key1不存在,則失敗,這個指令要求key必須存在.

 

5.      刪除

基本語法是

delete key名

比如

delete key1


u      如何使用php程序操作我們的memcached服務 curd.

步驟,準備工作.

(1)   把 php_memcache.dll 文件拷貝 php的ext 下

☞ 不同版本的php 所使用的 php_memcache.dll的版本不一樣

(2)   修改php.ini文件,加載 php_memcache.dll (該文件就是封裝了一堆函數)

;加載php_memcache.dll 文件

extension=php_memcache.dll

(3)   重新啓動apache

(4)   我們寫程序來完成curd操作.

 

細節: 在我們添加數據的時候,如果

bool Memcache::add ( string $key , mixed$var [, int $flag [, int $expire ]] )

如果報 expire 設爲0 表示,永不過期.(只要memcache不重新啓動,就永遠在mem中)

exprie 直接給的是秒數,則最大 30*3600*24

如果你希望保持時間超過30  time()+天數*3600*24 即可


<?php

             

   //創建一個mem對象實例

       $mem=newMemcache;

    

       if(!$mem->connect("127.0.0.1",11211)){

              die('連接失敗!');

       }

 

       //增加

 

       //1.增加一個字串

/*    if($mem->set('key1',"beijing",MEMCACHE_COMPRESSED,60)){

             

              echo'添加ok';

       }*/

//查詢

 

       $val=$mem->get('key1');

 

       var_dump($val);

 

       //修改

       //可以使用replace

       if($mem->replace("key11",'hello',MEMCACHE_COMPRESSED,60)){

              echo'replace ok';

       }else{

              echo'replace no ok';

       }

 

 

 

       //刪除

       echo"<br/>";

       if($mem->delete('key14')){

              echo'key14 刪除';

       }else{

              echo'key14不存在';

       }


?>

分佈式memcached測試:

<?php


//我的電腦上有兩個memcahced服務.


$mem=new Memcache;


$mem->addServer('127.0.0.1',11211);
$mem->addServer('127.0.0.1',9999);
$mem->addServer('127.0.0.1',9998);



//這裏注意,把key1,放入到 11211端口的mem還是
//9999 端口的mem就不要我們操心,有$mem對象本身維護.
if($mem->set('key1','hello',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}
if($mem->set('key2','hello2',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}
if($mem->set('key3','hello3',MEMCACHE_COMPRESSED,300)){
echo 'add ok!';
}

?>

總結:

1.      mem服務的數據不是同步的, 數據是分佈的

2.      把什麼數據放入到哪個memcached是由客戶端的mem對象決定

3.      當執行addServer的時候,並不是立即去連接mem服務,而是通過計算,hash後纔去決定連接哪個mem服務,因此當你大量加入服務器到連接池,沒有多餘開銷

 

u      memcache的細節討論

①    生命週期

從數據放入mem開始計時,直到時間到了,就銷燬, 如果時間爲0, 則表示不過期.

memcache的數據被銷燬的情況如下:

1.      時間到

2.      重啓memcached服務

3.      重啓memcached服務所在的機器

4.      delete / flush 銷燬數據

②    如何把session數據放入到memcached服務中.

步驟:

1.      修改php.ini的配置文件

如下:

;[sesson.save_handler有user|files|memcache]

session.save_handler= memcache

session.save_path= "tcp://127.0.0.1:11211"

③    測試一把,重啓apache

測試ok

<?php

 

       //傳統的代碼

       session_start();

       $_SESSION['name']='天龍八部300';

       $_SESSION['city']='beijing';

       class Dog{

              public $name;

       }

 

       $dog1=new Dog;

       $dog1->name='abcde';

       $_SESSION['dog']=$dog1;

 

       //如果session數據入mem,那他一定是以session_id爲

       //key值進行添加

      

       //取出

       $name=$_SESSION['name'];

       echo "name=$name";

       echo "sessionid=".session_id();

 

 

思考,如果管理員,不讓我們修改php.ini 文件,我們如何處理session入memcached這個功能, 我們通過一個函數可以去修改 php.ini 的配置.

 

代碼:

<?php

 

       ini_set("session.save_handler","memcache");

       ini_set("session.save_path","tcp://127.0.0.1:9999");

 

同時你也可以通過 ini_set 去動態的修改對php.ini 的其它設置 。但是他不影響其它php頁面,也不會去修改php.ini 文件本身, 只對本頁面生效.

 

 memcached vs session比較

memcached 主要的目的是提速 ,因此它是一種無狀態的數據.即,數據不和用戶綁定.

session數據是和綁定的,因此是一種有狀態數據.

 

memached安全性

如何使用memcached 服務纔是安全的.

 

在windows下通過啓用防火牆來保護我們的memcached

在linux 也可以使用防火牆.

setup 配置防火牆

iptables -ainput -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT

 

什麼樣的數據適合放入memcached中?

變化頻繁,具有不穩定性的數據,不需要實時入庫,如在線用戶,session信息

和memcached技術類似是redis (key/value數據庫),也是把數據放在內存中,並定時向磁盤同步

發佈了53 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章