memcached相關(guān)總結(jié)

Memcache技術(shù)概述

Memcached 是國外社區(qū)網(wǎng)站LiveJournal的開發(fā)團隊開發(fā)的高性能的分布式內(nèi)存緩存服務(wù)器。一般的使用目的是,通過緩存數(shù)據(jù)庫查詢結(jié)果,減少數(shù)據(jù)庫訪問次數(shù),以提高動態(tài) Web 應(yīng)用的速度、提高可擴展性。

memcached memory cache = 內(nèi)存緩存!

就是把數(shù)據(jù)存儲在內(nèi)存中的管理設(shè)備

數(shù)據(jù)庫的數(shù)據(jù):把數(shù)據(jù)庫的數(shù)據(jù)使用PHP處理之后的數(shù)據(jù)存儲進來;

靜態(tài)化的數(shù)據(jù):靜態(tài)資源都是可以存儲到這里的!

memcached與mysql存儲的數(shù)據(jù)區(qū)別:

memcached里面的數(shù)據(jù),如果沒有,就可以到mysql存儲的數(shù)據(jù)里面去查詢。

memcached里面的數(shù)據(jù),是臨時的,可以消失的,也是不重要的。

mysql里面的數(shù)據(jù),是非常重要的,不能遺失的!

memcached特性:

memcached的數(shù)據(jù)是不可持久化,只能保存在內(nèi)存里面。

持久化:把數(shù)據(jù)存儲到硬盤!

memcached只支持key=>value的數(shù)據(jù)結(jié)構(gòu),所以只有字符型。

memcached的key支持250字節(jié);

memcached的value支持1M大?。?/p>

memcached的數(shù)據(jù)不可備份不可主從

我們memcached放棄了一些東西,得到了高速的響應(yīng)速度。

memcached可以支持的并發(fā)數(shù)量上萬。所有很多時候,memcached都不會成為網(wǎng)站的瓶頸。

在代碼里使用它:

//連接memcached
...
$data = $mem -> get('data');
if(empty($data))
{
    //連接MySQL獲取新的數(shù)據(jù)
    ...
    $ret = mysqli_query($db, $sql);
    //處理ret
    ...
    $data  //處理完成之后,得到data數(shù)據(jù)
    //存儲到memcached
    $mem -> set('data', $data);
}

Memcache軟件安裝(linux下)

1、下載這個軟件

http://memcached.org/

2、在linux上面查看

(1)解壓

解壓軟件和依賴軟件:

tar -zxf memcached-1.4.34.tar.gztar -zxf libevent-2.0.22-stable.tar.gz

(2)安裝依賴包

進入到依賴包的文件夾里,查看幫助信息:./configure --help

確定使用的參數(shù):--prefix:安裝的位置

進行源碼安裝:

./configure --prefix=/usr/local/libevent && make && make install

(3)安裝memcached

進入memcached的目錄,查看幫助信息:./configure --help

確定使用的參數(shù):

--prefix:安裝的位置

--with-libevent:依賴安裝的位置

進行源碼安裝:

./configure --prefix=/working/memcached \ --with-libevent=/usr/local/libevent/

make && make install

(4)查看幫助信息

/working/memcached/bin/memcached -h

需要知道的參數(shù):

-p:默認端口號是11211,可使用-p來修改

-d:守護進程,后臺運行

-u:指定運行的用戶,是root

-m:管理的內(nèi)存

-c:同時連接數(shù)

3、啟動Memcache服務(wù)器

/working/memcached/bin/memcached -d -u root

查看是否啟動成功,查看進程:

ps aux | grep memcached

PID號,就是主進程(父進程)的進程號。有一些程序直接寫在文件里面的。

查看端口號:

netstat -tanp | grep memcached

4、連接Memcache服務(wù)器

找到客戶端:telnet 192.168.xxx.xx 11211

如果沒有連接成功,可能是linux防火墻沒有通過11211這個端口

關(guān)閉防火墻:

(1)臨時關(guān)閉:立即生效

service iptables stop

(2)永久關(guān)閉:重啟之后生效

# chkconfig --list iptables
iptables  0:關(guān)閉  1:關(guān)閉  2:啟用  3:啟用  4:啟用  5:啟用
這個數(shù)字表示的是開機啟動的模式;終端模式是3;圖形化是5;
啟用:表示使用該模式啟動的時候,該程序會被啟動。
關(guān)閉:表示使用該模式。程序不會隨系統(tǒng)啟動。

chkconfig --level 2345 iptables off

在關(guān)閉防火墻后再使用telnet登錄。

5、Memcache命令詳解

可以使用終端使用telnet命令,連接上我們的memcached服務(wù)器!請注意,我們使用的telnet命令,并不是我們memcached專用的客戶端,有可能會出現(xiàn)小問題,這都是正常!

我們在telnet連接的命令窗口操作的命令,是我們窗口操作模式的實現(xiàn),我們在PHP里面的操作,是完全不一樣的。

(1)命令

xshell中使用telnet連接的命令,是為了方便我們檢查服務(wù)器里面的數(shù)據(jù);假如你使用PHP寫入數(shù)據(jù)在memcached服務(wù)器里面了,這個時候,你想要檢查正確與否,就使用xshell使用telent連接上服務(wù)器,進行數(shù)據(jù)檢查!

add :添加數(shù)據(jù)。只能添加key是不存在的。如果key是存在的就報錯

add key 0 0 4

比如:add name 0 0 5 回車后輸入:luhao即可保存

key :設(shè)置一個下標

0:壓縮

0:時間

4:你要設(shè)置的值,是4個字節(jié)

set:添加數(shù)據(jù)。如果key是存在的,就直接覆蓋。set key 0 0 4

比如:set age 0 0 2 回車后輸入:12

get:獲得值get key

比如:get age

incr:指定增加多少。incr key 10

比如:incr age 10 //年齡+10

decr:指定減少多少。

decr age 10

decr與incr可以操作的最大范圍是2^64無符號:0 – (2^64 – 1)

只能在這個范圍里面去設(shè)置,過了這個范圍,就會報錯。

當incr到達最大值的時候,比如set age 0 0 20 -> 18446744073709551610 -> incr age 1

age的值會變成0。所以,使用incr到達最大值的時候,會直接從0開始,繼續(xù)向前加。

而decr在到達最小值的時候,一直減下去,依然是0。

delete:刪除一個key;delete key

比如:delete age

flush_all:清空;flush_all

清空時要注意,不要隨便清空數(shù)據(jù),因為在數(shù)據(jù)庫里會有別人項目的數(shù)據(jù)。

stats:查看狀態(tài);stats

當我們使用get一次的時候,獲取到了數(shù)據(jù)就是命中;沒有獲取到數(shù)據(jù),就是未命中 。

memcached是緩存設(shè)置,是為了解決mysql連接的問題。所以我們緩存的數(shù)據(jù),應(yīng)該保持比較高的命中,這樣才能解決mysql連接的問題。

如果命中不高,就證明緩存的數(shù)據(jù)有問題了。應(yīng)該重新設(shè)置一下緩存數(shù)據(jù)。讓緩存有意義。

(2)PHP中memcached擴展的對象方法對比

如果用PHP操作memcached,必須把PHP變成memcached服務(wù)器的客戶端,就要安裝memcached的擴展。安裝好了,就變成客戶端了。

安裝客戶端的時候,你安裝的是memcache,查看文檔的時候,就找memcache,你安裝的是memcached,你看文檔的時候,就是memcached。

memcache不支持PHP7;memcached支持PHP7。

public bool Memcached::add(string $key, mixed $value [, int $expiration])

該方法,如果key已經(jīng)在服務(wù)端存在,此操作會失敗。其中參數(shù)expiration,是到期時間,默認為0,如果該值設(shè)置為默認0時,則此元素永不過期(但是它可能由于服務(wù)器為了給其它新元素分配空間而被刪除)。

public bool Memcached::set(string $key, mixed $value [, int $expiration])

該方法,將value存儲在memcached服務(wù)器上的key下,如果有expiration參數(shù),則可以控制值的過期時間。值可以是任何有效的非資源型php類型,因為資源類型不能被序列化存儲。如果Memcached::OPT_COMPRESSION選項開始,序列化的值會同樣被壓縮存儲。

注意:資源類型的不能被序列化,所以不可以存儲到memcached里面。

6、PHP中使用Memcache

(1)在linux中安裝擴展memcached.so

到擴展網(wǎng)站,下載對應(yīng)文件包:

http://pecl.php.net/package-search.php?pkg_name=memcache&bool=AND&submit=Search

上傳到linux中,解壓后開始操作。

①安裝依賴

進入到解壓的依賴目錄中/libmemcached-1.0.18

./configure --prefix=/usr/local/libmemcached && make && make install

②安裝memcached擴展

進入到memcached擴展目錄memcached-3.0.4

但是在該目錄中沒有找到configure文件!

configure這個文件,必須由你為哪一個PHP版本生成擴展,就由這個版本的phpize程序執(zhí)行完成來生成的。

找到php安裝目錄開始操作

/working/php7/bin/phpize回車,即可生成memcached的configure文件

回到memcached安裝目錄,查看幫助信息:./configure --help確定參數(shù)。

--prefix :嚴重警告??!給PHP安裝擴展的時候,不要指定安裝的位置?。?/p>

--with-php-config :這個就是PHP版本里面的php-config的絕對路徑。確定你找的這個php-config的絕對路徑,是與上面生成configure的phpize程序是同一個版本下面的。

php-config phpize :這2個程序,必須是同一個PHP版本下面的。

--with-libmemcached-dir :安裝的依賴路徑。

檢查環(huán)境,生成makefile文件

./configure --with-libmemcached-dir=/usr/local/libmemcached/ --with-php-config=/working/php7/bin/php-config

如果出現(xiàn)報錯是缺少一個sasl.h這個依賴,可以選擇不安裝,這個依賴不是必須存在的。

關(guān)閉來操作:

./configure --with-libmemcached-dir=/usr/local/libmemcached/ --with-php-config=/working/php7/bin/php-config --disable-memcached-sasl

安裝到系統(tǒng):make && make insatll

安裝完成后可以到目錄/working/php7/lib/php/extensions/no-debug-zts-20160303下,可以看到memcached.so,這個就是生成的擴展文件。

注:linux上的php擴展,都是以.so結(jié)尾!

打開php.ini,大概在900+行的位置,配置添加:extension=memcached.so

重啟Apache!

③檢查擴展

方式一:php -m

方式二:用php程序來執(zhí)行phpinfo.php頁面

/working/php7/bin/php /站點目錄/phpinfo.php | grep memcached

(2)php連接memcache服務(wù)器

//連接memcached
$mem = new memcached();
$mem -> addServer('192.168.xxx.xx', 11211);
$res = $mem -> getStats();
var_dump($res);

7、探究Memcache能存儲的數(shù)據(jù)類型

(1)使用PHP存儲標量類型

字符類型:

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$str = 'qwerty';
$mem -> set('str', $str);

執(zhí)行頁面后,進入memcached服務(wù)器查看:

get str

布爾類型

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);

$true = true;
$mem -> set('true', $true);
$false = false;
$mem -> set('false', $false);

執(zhí)行頁面后,進入memcached服務(wù)器查看:

get true

get false

說明:當我們存儲數(shù)據(jù)的時候,memcached擴展幫助我們實現(xiàn)了隱式轉(zhuǎn)換,然后在存儲到memcached服務(wù)器。

整型類型

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$int = 123;
mem -> set('int', $int);

執(zhí)行頁面后,進入memcached服務(wù)器查看:

get int

浮點類型

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$f = 123.123;
mem -> set('f', $f);

執(zhí)行頁面后,進入memcached服務(wù)器查看:

get f

通過這四種類型,都可以正常存儲

(2)使用PHP存儲復(fù)合類型

數(shù)組

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$arr = [1, 2, 3, 4];
mem -> set('arr', $arr);

執(zhí)行頁面后,進入memcached服務(wù)器查看:

get arr

這個數(shù)據(jù),就是memcached擴展幫助我們序列化之后,存儲到里面的。獲得的時候,memcached擴展也會幫助我們反序列化回來。

對象

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$obj = new A;
$mem -> set('obj', $obj);
$res = $mem -> get('obj');
var_dump($res -> getName());

class A
{
    public $name = 'zhangsan';
    public function getName()
    {
        return $this -> name;
    }
}

執(zhí)行頁面后,由于在代碼中有打印代碼,所以會在瀏覽器中顯示出“zhangsan”。

進入服務(wù)器查看:get obj

服務(wù)器存儲的數(shù)據(jù),就是序列化之后的結(jié)果。

(3)使用PHP存儲特殊類型

null

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$null = NULL;
$mem -> ('null', $null);
$res = $mem -> get('null');
var_dump($res);

查看服務(wù)器:get null

結(jié)果:這個也是序列化之后的數(shù)據(jù)。

資源

$mem = new memcached();
$mem -> addServer('127.0.0.1', 11211);
$re = $mem;
$mem -> set('re', $re);

$res = $mem -> get('re');
var_dump($res -> getStats());

訪問瀏覽器時出現(xiàn)報錯!

原因:資源類型不能被序列化存儲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、memcache的概念? Memcache是一個高性能的分布式的內(nèi)存對象緩存系統(tǒng),通過在內(nèi)存里維護一個統(tǒng)一的巨...
    桖辶殤閱讀 2,358評論 2 12
  • 一、MemCache簡介 session MemCache是一個自由、源碼開放、高性能、分布式的分布式內(nèi)存對象緩存...
    李偉銘MIng閱讀 4,003評論 2 13
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,289評論 2 89
  • Memcached 教程 Memcached是一個自由開源的,高性能,分布式內(nèi)存對象緩存系統(tǒng)。 Memcached...
    大熊_7d48閱讀 2,721評論 0 0
  • 帶娃有老人,摸著良心說,解決了不少問題。然而,總有些細節(jié)讓人抓狂。 這兩天,我?guī)е熘軞q的女兒暖暖去姥姥家住,感受...
    光束俠閱讀 224評論 9 1

友情鏈接更多精彩內(nèi)容