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、下載這個軟件
2、在linux上面查看
(1)解壓
解壓軟件和依賴軟件:
tar -zxf memcached-1.4.34.tar.gz和tar -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 1age的值會變成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)報錯!
原因:資源類型不能被序列化存儲。