memcached在widdows環境下的詳細剖析

更多內容清訪問www.phptuku.com
一.memcached 基本概念

    Memcached是一個高性能的分佈式的內存對象緩存系統,用於減少數據庫負載,提升性能。包括服務端和客戶端。目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力,通過在內存裏維護一個統一的巨大的hash表,通過自己的算法開維護數據的操作。它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然後從內存中讀取,從而大大提高讀取速度。
這裏寫圖片描述

二.memcached的安裝(Windows下的安裝)

  1. 下載memcached軟件,http://memcached.org/download
  2. 將memcached軟件拷貝到某個目錄,最好放在php開發環境目錄下,與apache,php,mysql同級目錄,便於管理
  3. 安裝 memcached –d install [卸載使用 memcached -d uninstall
  4. 啓動 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的數據被銷燬的情況如下:

  1. 時間到
  2. 重啓memcached服務
  3. 重啓memcached服務所在的機器
  4. delete / flush 銷燬數據
    ② 如何把session數據放入到memcached服務中.
    步驟:
  5. 修改php.ini的配置文件
    如下:
    ;[sesson.save_handler 有user|files|memcache]
    session.save_handler = memcache
    session.save_path = “tcp://127.0.0.1:11211”
    ③ 測試一把,重啓apache
    測試ok

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章