天天看點

memcached的入門及應用總結memcache

總結

源碼編譯方式的軟體安裝三部曲:

1、下載下傳(找官網)、解壓、進入解壓後的目錄

2、編譯參數

3、make && make install安裝

php擴充安裝舞步曲:

1、下載下傳(找pecl)、解壓、進入解壓後的目錄

2、使用php自帶的二進制腳本phpize弄成可編譯的

3、編譯參數

4、make && make install安裝

5、将擴充添加到php.ini中,重新開機php,看php -m中是否添加成功

redis和memcache的差別: 1、memcache重新開機後資料丢失

2、redis不會,redis持久化

memcache

什麼是memcache:

分布式高速緩存系統。可以在多台伺服器安裝就是分布式,可以在達到很好的叢集效果

是應用和資料庫中間的緩沖層:第1次走資料庫,然後存到memcache中,之後就從memcache讀取(當然會涉及到是否過期等問題)

我的了解:memcache是一張隻有2個字段的表。Key(id)和value(值)字段

在什麼時候使用memcache:

1、非持久化存儲:對資料存儲要求不高(斷電或伺服器重新開機會給記憶體清空)

2、分布式存儲:不适合單機使用(因為很吃記憶體,非要單機的話,專門找個伺服器做memcache。不要将資料庫和memcahe裝在同一台伺服器)

3、key/value存儲:格式簡單、不支援list、array等資料格式

知道怎樣使用memcache優化網站或api:

定期檢視緩存的分布情況和擊中情況,根據查詢結果進行優化

項目中使用memcache:

1、既時生成緩存适用于:新聞、詳情頁等靜态資源頁。第1個使用者進來的時候生成緩存,在進來的n個人就直接走緩存。設定個時間,當過了1星期,可以直接在緩存中删除

2、提前生成緩存适用于:首頁。通路量較大,資料量又比較多的情況。使用linux定時腳本的方式提前生成緩存

3、永久緩存适用于:關于我們,這種單獨的頁面,修改頻率相當低,隻有當修改了,才從新生成緩存

使用memcache的思路:

以及時生成緩存為例:

思路:先查詢memcache中有沒有對應的緩存(就是判斷屬性中有無)。

有就傳回。

沒有就查詢,查詢的時候設定一份存到屬性中。

每次新增資料成功以後,删掉舊的緩存

安裝:

我的環境是阿裡雲ecs,centos7.2的,裝的一鍵lnmp

安裝服務端

官網: http://memcached.org/

memcached的入門及應用總結memcache

wget  http://www.memcached.org/files/memcached-1.5.5.tar.gz   //1、下載下傳

tar xf memcached-1.5.5.tar.gz                   //2、解壓

cd memcached-1.5.5                        //切換進入解壓目錄

yum install libevent-devel -y                   //安裝依賴

./configure --prefix=/usr/local/Memcached             //3、編譯參數

make && make install                       //4、安裝

啟動:

注意:memcache沒有配置檔案,是以要在啟動中輸入

./memcached -u root -p 11211 -P /var/run/memcached.pid -d #此啟動所有的ip都可以連接配接

memcached的入門及應用總結memcache

/usr/local/Memcached/bin/memcached -u root -p 11211 -P /var/run/memcached.pid -l ip -d

-u 指定運作使用者(線上最好不要經常使用root)

-p運作端口(小寫),最好是1024以上的端口

-P pid檔案(大寫)

-d 守護程序 daemon 運作  

-l memcache伺服器的内網ip才可登陸,指定一個ip(用本機)

-m 為memcache配置設定多少記憶體,機關兆(配置低分150)

-c是最大運作的并發連接配接數,預設是1024;

連接配接測試:

memcached的入門及應用總結memcache

telnet 127.0.0.1 11211 #ip輸入 上面-l的參數

set key 0 0 5 //存資料

hello

get key      //取資料

quit  #退出telnet

注意:重新開機後memcached資料丢失

安裝擴充

http://pecl.php.net   擴充都在這裡下載下傳

memcache  memcached extension
memcached  PHP extension for interfacing with memcached via libmemcached library

第1個是完全在PHP架構内開發的memcache(php手冊中的)

第2個是使用libmemcached的memecached(推薦用這個,性能更好)

wget  http://pecl.php.net/get/memcached-3.0.0.tgz    //1、下載下傳

tar xf memcached-3.0.0.tgz        //解壓

cd memcached-3.0.0        //切換進解壓後的目錄

/usr/local/php/bin/phpize  //2、二進制腳本工具,使用這工具後就可以編譯參數了

yum install libmemcached-devel –y  //安裝依賴

./configure --with-php-config=/usr/local/php/bin/php-config  //3、編譯參數

make && make install        //4、安裝

memcached的入門及應用總結memcache
memcached的入門及應用總結memcache
memcached的入門及應用總結memcache

配置 php.ini

extension_dir = /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/ #所有擴充基本都在這個目錄下,這個目錄引入一次即可

extension = memcached.so   //5、将擴充添加到配置檔案中

memcached的入門及應用總結memcache

結果:

重新開機伺服器

輸入php -m 檢視擴充

memcached的入門及應用總結memcache

memcache類的操作和封裝

注意:php中有2個memcache類,我用的memcached類

memcached的入門及應用總結memcache

主要分為2大類:1、系統類 2、資料類 

1、系統類

memcached的入門及應用總結memcache
memcached的入門及應用總結memcache
memcached的入門及應用總結memcache
memcached的入門及應用總結memcache
memcached的入門及應用總結memcache

因為這個伺服器是不存在的

2、資料類

memcached的入門及應用總結memcache
memcached的入門及應用總結memcache

3、優雅快速的使用memcache

memcached的入門及應用總結memcache
memcached的入門及應用總結memcache

4、封裝自己類的總結

1、擴充性 2、可調試 3、盡量簡便的操作,一個方法多種功能(用swtich判斷,調不同的方法)

<?php
/**
 * 封裝自己的memcache類
 * 封裝的目的是為了切換緩存引擎, 比如改用redis, 開發中使用的類調用的方法名一樣,但是内部實作調用的是不同的引擎(工廠模式的思想)。
 */

class Mem{
    private $type = 'Memcached';
    private $m; //執行個體化的對象
    private $time = 0;      //緩存時間
    private $error;     //錯誤
    private $debug = 'true';

    public function __construct()
    {
        if(!class_exists($this->type)){
            $this->error = $this->type.'類不存在';
            return false;
        }else{
            $this->m = new $this->type;
        }
    }

    /**
     * 添加多台伺服器
     * @param $arr 是個二維數組
     */
    public function ads($arr){
        $this->m->addServers($arr);
        //如果傳回結果是一個對象,并且對象某個屬性的值還對,就是添加成功
    }

    /**
     * 思想:傳不同的參數,調用同一個方法,實作不同的功能
     * @param $key
     * @param $value
     * @param $time
     */
    public function s($key,$value='',$time=null){
        //傳過來的參數是1個,那就是get方法
        if(func_num_args() == 1){
            //注意:這裡不用$this->debug,是因為預設為true直接就進if然後return了,然後下面就不會執行了,是以他列印不出來
            return $this->m->get($key);     //【查】
            //注意:加這也沒效果,上面有return也是直接傳回了。不知道老師是get方法中加debug是啥意思??
        } else if(func_num_args() >= 2){
            if($value === null){
                $this->m->delete($key);     //【删】
            }else{
                if($time === null){
                    $time = $this->time;    //用屬性中緩存的時間
                }
                $this->m->set($key,$value,$time);   //【加】
                return $this->debug();     //注意:這到無所謂,頂多上面執行完咯,有錯誤傳回錯誤。但也要調用s方法得時候用echo輸出下
            }
        }
    }

    private function debug(){
        //開啟調試模式才傳回錯誤資訊
        if($this->debug){
            if($this->m->getResultCode() != 0){
                return $this->m->getResultMessage(); //直接傳回錯誤資訊
            }
        }
    }


    /**
     * 錯誤處理的方法
     */
    public function getError(){
        if($this->error){
            return $this->error;
        }else{
            return $this->m->getResultMessage();
        }
    }
}
           

調用方法:用浏覽器通路,友善看

<?php
/**
 * 調用自己封裝的memcache類
 * 封裝的目的是為了切換緩存引擎, 比如改用redis, 開發中使用的類一樣,但是内部實作調用的是不同的引擎。
 */

//思想:傳不同的參數,調用同一個方法,實作不同的功能
include 'Mem.php';
$obj = new Mem();
$obj->ads([['127.0.0.1',11211]]);            //添加伺服器
$obj->s('h1','yangxi',0);   //傳3個參數是set【設定】
//$obj->s('h1',null);                        //傳2個參數是delete【删除】
echo $tmp = $obj->s('h1');              //傳1個參數是get【擷取】
echo "<br />";
echo $obj->getError();                    //擷取錯誤

           

繼續閱讀