更多內容清訪問www.phptuku.com
一.memcached 基本概念
Memcached是一個高性能的分佈式的內存對象緩存系統,用於減少數據庫負載,提升性能。包括服務端和客戶端。目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力,通過在內存裏維護一個統一的巨大的hash表,通過自己的算法開維護數據的操作。它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然後從內存中讀取,從而大大提高讀取速度。
二.memcached的安裝(Windows下的安裝)
- 下載memcached軟件,http://memcached.org/download
- 將memcached軟件拷貝到某個目錄,最好放在php開發環境目錄下,與apache,php,mysql同級目錄,便於管理
- 安裝 memcached –d install [卸載使用 memcached -d uninstall
- 啓動 memcached 服務
(1)直接通過界面啓動該服務
(2)在控制檯下啓動 memcached –d start
(3)查看memcached 服務是否啓動成功,可使用命令: memcached -h ,出現如下表示成功
參數說明:
-p 監聽的端口
-l 連接的IP地址, 默認是本機
-d start 啓動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關閉正在運行的memcached服務
-d install 安裝memcached服務
-d uninstall 卸載memcached服務
-u 以的身份運行 (僅在以root運行的時候有效)
-m 最大內存使用,單位MB。默認64MB
-M 內存耗盡時返回錯誤,而不是刪除項
-c 最大同時連接數,默認是1024
-f 塊大小增長因子,默認是1.25
-n 最小分配空間,key+value+flags默認是48
-h 顯示幫助
三.telnet操作memcached(CURD)
登錄到telnet,連接到memcached服務,命令窗口下輸入telnet 127.0.0.1 11211,
回車出現如下,輸入任何東西都不會顯現出來,看不到任何東西,這是因爲Win7 中將telnet 回顯功能關閉了
對當前框同時按下 “CTRL ”和“]” 健,將進入如下頁面:
輸入 “set localecho”,開啓回顯telnet回顯功能
按下Enter鍵,進入telnet 交互界面,這時候用戶可以看到自己的輸入了
telnet寫入memcache命令格式
<command name> <key> <flags> <exptime> <bytes> <data block>
參數說明:
command name:set/add/replace
key:查找關鍵字
flags:整型參數,客戶機使用它存儲關於鍵值對的額外信息
exptime:該數據的存活時間(以秒爲單位,0 表示永遠)
bytes:存儲字節數
data block:存儲的數據塊(可直接理解爲key-value結構中的value)
三.PHP操作memcached(CURD)
php操作memcached有以下三種形式:
- memcache擴展
- memcached擴展
- Sokket套接字操作,memcached-client.php
1.如何使用php操作memcached服務
(1)把php_memcache.dll文件拷貝到php的ext下
注意:不同版本的php 所使用的 php_memcache.dll 的版本不一樣
(2)修改php.ono配置,加載php_memcache.dll文件,extension=php_memcache.dll
(3)重新啓動apache
(4)寫代碼完成curd操作
<?php
//創建一個mem對象實例
$mem=new Memcache;
if(!$mem->connect("127.0.0.1",11211)){
die('連接失敗!');
}
//增加
//1.增加一個字串
if($mem->set('key1',"beijing",MEMCACHE_COMPRESSED,60)){
echo '添加ok';
}
//2.添加數值
if($mem->set('key1',100,MEMCACHE_COMPRESSED,60)){
echo '添加ok';
}
//3.添加數組
//在添加數組是,根據需要. 希望序列號放入 ,
//serialize<=>unserialize, 如果根據需要,也可以json_encode <=> json_decode
$arr=array("bj",'tj');
if($mem->set('key1',$arr,MEMCACHE_COMPRESSED,time()+31*3600*24)){
echo '添加數組ok99111';
}
//4.添加對象
class Dog{
public $name;
public $age;
public function __construct($name,$age){
$this->name=$name;
$this->age=$age;
}
}
$dog1=new Dog('小狗',50);
if($mem->set('key1',$dog1,MEMCACHE_COMPRESSED,60)){
echo '添加對象ok';
}
//5.添加null 布爾值
if($mem->set('key1',false,MEMCACHE_COMPRESSED,60)){
echo '添加布爾ok';
}
//6. 資源類型放入.
$con=mysql_connect("127.0.0.1","root","root");
if(!$con){
die('連接數據庫失敗');
}
var_dump($con);
echo "<br/>";
if($mem->set('key1',$con,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不存在';
}
2.如何使用PHP源碼來操作memcached服務
如果管理員不讓我們去加載 memcache.dll 文件,我們可以直接通過源碼操作.關閉擴展.
<?php
require_once 'memcached-client.php';
$mc = new memcached(array(
'servers' => array('127.0.0.1:11211'), //連接的memcacheip和端口
'debug' => false, //是否debug
'compress_threshold' => 10240, /*最大壓縮*/
'persistant' => true)); /*是否是持久連接*/
$mc->set('key1', array('some', 'array'));
// $mc->replace('key', 'some random string');
$val = $mc->get('key1');
var_dump($val);
//修改
$mc->replace('key1', "北京");
$val = $mc->get('key1');
var_dump($val);
//刪除
$mc->delete('key1');
$val = $mc->get('key1');
echo "刪除後";
var_dump($val);
3.memcached機制深入瞭解
①基於c/s架構 ,協議簡單
- c/s架構,此時memcached爲服務器端,我們可以使用如PHP,c/c++等程序連接memcached服務器。
- memcached的服務器客戶端通信並不使用XML等格式,而使用簡單的基於文本行的協議。因此,通過telnet也能在memcached上保存數據、取得數據
②基於libevent的事件處理
- libevent是一套跨平臺的事件處理接口的封裝,能夠兼容包括這些操作系統:Windows/Linux/BSD/Solaris 等操作系統的的事件處理。
- Memcached 使用libevent來進行網絡併發連接的處理,能夠保持在很大併發情況下,仍舊能夠保持快速的響應能力。
③內置內存存儲方式
爲了提高性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中。由於數據僅存在於內存中,因此重啓memcached、重啓操作系統會導致全部數據消失。另外,內容容量達到指定值之後,就基於LRU(Least Recently Used)算法自動刪除不使用的緩存。memcached本身是爲緩存而設計的服務器,因此並沒有過多考慮數據的永久性問題。
④基於客戶端的分佈式
- memcached儘管是“分佈式”緩存服務器,但服務器端並沒有分佈式功能。各個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);
$mem->addServer('127.0.0.1',9997);
$mem->addServer('127.0.0.1',9996);
//這裏注意,把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!';
}
<?php
//如何從多個mem中取出你的key?
$mem=new Memcache;
$mem->addServer('127.0.0.1',11211);
$mem->addServer('127.0.0.1',9999);
$val=$mem->get('key1');
echo '程序中取出分佈的值='.$val;
總結:
1. mem服務的數據不是同步, 數據是分佈的
2. 把什麼數據放入到哪個memcached是由客戶端的mem對象決定
3. 當執行addServer的時候,並不是立即去連接mem服務,而是通過計算,hash後纔去決定連接哪個mem服務,因此當你大量加入服務器到連接池,沒有多餘開銷
4.memcached細節
① 生命週期
從數據放入mem開始計時,直到時間到了,就銷燬, 如果時間爲0, 則表示不過期.
memcache的數據被銷燬的情況如下:
- 時間到
- 重啓memcached服務
- 重啓memcached服務所在的機器
- delete / flush 銷燬數據
② 如何把session數據放入到memcached服務中.
步驟: - 修改php.ini的配置文件
如下:
;[sesson.save_handler 有user|files|memcache]
session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211”
③ 測試一把,重啓apache
測試ok