memcache

Memcached

Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。


memcache 是一個 C/S 結構server 端:memcachedclient 端:memcache

 

 

運行模式: C/S

端口號:11211

[root@silence80 ~]# vim /etc/services

wKiom1XHYszg0-dmAAEx-WEKNEA216.jpg

作用:

memcached 可以緩存 mysql 的查詢結果,優化 mysql  I/O。

 

 運行機制: 普通情況:

user ->web->mysql

wKiom1XHY4rBFYJDAAFR7OITVNI125.jpg

使用 memcache 情況:

user->web  ->memcache->mysql

wKiom1XHY57D9gDiAAFYfpmC1bc468.jpg

1) memcache 的優先級大於 mysql,查找數據流程:

web 向數據庫取數據的時候 優先去找 memcache


如果找到  y 拿數據

如果沒找到N web 去找 mysql

 Y 去寫入 memcache 一份 web 繼續處理請求


2) 數據放到 memcache 會優化 mysql  I/O,因爲內存比硬盤快

memcached 緩存數據的方式: 1、 將數據全部緩存在內存  ,  2、緩存到硬盤中。[如果要緩存的 數據量不是非常大  不建義]

注: 緩存斷電後 所有緩存數據全部丟失


3)memcached 存儲緩存數據的方式:

將 mysql 的查詢結果  以 key = value 的形式寫入內存

每條數據都有自己的有效期, 在有效期內  我們稱之爲熱點數據 過期數據叨髒數據



4) memcache 內存緩存大小

32bit 操作系統 2G

64bit 操作系統 沒限制



5) 數據緩存週期

數據緩存週期, 可以自定義 , 即使調設爲永麗不過期的數據, 默認也會在 30 天后過期



一、安裝 lamp 源碼編譯 LNMP 環境

略過


二、安裝 memcached

上傳軟件包: libevent-2.0.22-stable.tar.gz  memcached-1.4.22.tar.gz

安裝 libevent

[root@silence80 ~]# tar zxvf libevent-2.0.22-stable.tar.gz

[root@silence80 ~]# cd libevent-2.0.22-stable

[root@silence80 libevent-2.0.22-stable]# ./configure   --prefix=/usr/local/libevent   #檢查 系統編譯環境

[root@silence80 libevent-2.0.22-stable]# make   -j   4 # 將源碼編譯成二進制,   -j   4 使用

4 個進程同時編譯

[root@silence80 libevent-2.0.22-stable]# make install   #安裝 查看安裝後的文件:

[root@silence80 libevent-2.0.22-stable]# ls /usr/local/libevent/

bin   include   lib



安裝服務器端:memcached

[root@silence80 ~]# tar zxvf memcached-1.4.22.tar.gz

[root@silence80 ~]# cd memcached-1.4.22

[root@silence80 memcached-1.4.22]# ./configure   --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/

[root@silence80 memcached-1.4.22]# make -j 4 

[root@silence80 memcached-1.4.22]# make install 

[root@silence80 memcached-1.4.22]# echo $?

0

啓動 memcached

[root@silence80 memcached-1.4.22]# /usr/local/memcached/bin/memcached -u root -p

11211 -l 192.168.1.63 -P /var/run/memcached.pid -m 128m -c 2048 -d

[root@silence80 memcached-1.4.22]# echo $?

0

參數:

-u  user

-p port

-l listen



-P pid

-m 內存緩存大小

-c 最大併發

-d  作爲守護進程在後臺運行



查看端口:

[root@silence80 ~]# netstat -antup | grep 11211

tcp 0 0 192.168.1.63:11211 0.0.0.0:* LISTEN

9801/memcached

udp 0 0 192.168.1.63:11211 0.0.0.0:*

9801/memcached




測試,連接 memecached 讀寫數據



#使用 telnet 連接 memcache,進行測試

詫法:telnet IP 11211

[root@silence80 ~]# rpm -ivh /mnt/Packages/telnet-0.17-47.el6.x86_64.rpm

warning: /mnt/Packages/telnet-0.17-47.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY

Preparing... ########################################### [100%]

1:telnet ########################################### [100%]



實例:使用 telnet 連接 memcache,進行測試

telnet 寫入 memcache 命令栺式

<command name> <key> <flags> <exptime> <bytes>回車換行 <data block>回車換行 參數詳解:

1.<command name> 可以是”set”

set:<key>不存在時添加,<key>存在時覆蓋。

2.<key> 保存數據的 key

3.<flags> 是一個 16 位的無符號的整數(以十進制的方式表示)。 該標誌將和需要存儲的數據一起存儲,並在客戶端 get 數據時返回。 客戶可以將此標誌用做特殊用途,此標誌對服務器來說是透明的。

4.<exptime> 過期的時間。

0 表示存儲的數據永進不過時。

非 0(unix 時間),當過期後,服務器可以保證用戶得不到該數據(以服務器時間爲標準)。

5.<bytes> 需要存儲的字節數(不包含最後的”\r\n(回車換行)”),當用戶希望存儲空數據時,可以爲 0

6.最後客戶端需要加上”\r\n”作爲”命令頭”的結束標誌。

7.<data block>\r\n 緊接着”命令頭”結束之後就要發送數據塊(即希望存儲的數據內容),最後加上”\r\n”作爲此次通訊的結 束。



當以上數據發送結束之後,服務器將返回一個應答。可能有如下的情況:

1.STORED\r\n:表示存儲成功


2.NOT_STORED\r\n: 表示存儲失敗,但是該失敗不是由於錯諢。



實例:使用 memcache 存儲數據

[root@silence80 ~]# telnet 192.168.1.63 11211

Trying 192.168.1.63... Connected to 192.168.1.63. Escape character is '^]'.

set name 4 300 7

 jacker

  STORED

get name

VALUE name 4 7 silence

END

quit

Connection closed by foreign host.

參數說明:

set name 4 300 7

#往 memcached 緩存中存儲一個鍵值,標誌 4 ,緩存時間 300 秒,字符串長度是 6 個字節

silence   #輸入內容

STORED   # 該標誌代表是存入成功

get name #get 命令讀取緩存數據 VALUE name 4 6

silence

END 該標誌代表結束

quit   #退出




#思考 memcache 的 -m 設置內存緩存大小爲多少合適?

如果本服務器只運行 memcache, -m 應爲物理內存的 80%-70% 根據數據量來設定



三、安裝客戶端 memcache,即生成 memcache 模塊

phpize 概述:

phpize 是用來擴展 php 擴展模塊的,通過 phpize 可以建立 php 的擴展模塊 默認情況,源碼編譯的 php 中自帶這個命令文件:



查看:

[root@silence80 memcache-2.2.7]#ls   /server/php-5.4-nginx/bin/phpize



生成 memcache 客戶端模塊

[root@silence80 ~]# tar -zxvf memcache-2.2.7.tgz 

[root@silence80 ~]# cd /root/memcache-2.2.7 

[root@silence80 memcache-2.2.7]# ls

config9.m4 memcache.c memcache_queue.h config.m4 memcache_consistent_hash.c  memcache_session.c

config.w32   memcache.dsp memcache_standard_hash.c CREDITS memcache.php php_memcache.h

example.php   memcache_queue.c README



[root@silence80 memcache-2.2.7]# /server/php-5.4-nginx/bin/phpize

Configuring for:

PHP Api Version: 20100412

Zend Module Api No: 20100525

Zend Extension Api No: 220100525 

[root@silence80 memcache-2.2.7]# ls

acinclude.m4  configure.in memcache.php aclocal.m4 config.w32 memcache_queue.c autom4te.cache   CREDITS memcache_queue.h build example.php memcache_session.c

config9.m4 install-sh memcache_standard_hash.c config.guess ltmain.sh missing

config.h.in Makefile.global mkinstalldirs config.m4  memcache.c php_memcache.h config.sub memcache_consistent_hash.c  README configure  memcache.dsp run-tests.php 

注:發現多了很多文件

編譯安裝:

# ./configure --enable-memcache --with-php-config=/server/php-5.4-nginx/bin/php-config

[root@silence80 memcache-2.2.7]# make -j 4

See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages.

----------------------------------------------------------------------



Build complete.

Don't forget to run 'make test'.



[root@silence80 memcache-2.2.7]# make install

Installing shared extensions:

/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/

查看編譯出來的模塊:

[root@silence80 memcache-2.2.7]# ll

/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/memcache.so

-rwxr-xr-x 1 root root 259104 May 26 08:33

/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/memcache.so



查看 php.ini 配置文件位置:

訪問:http://192.168.1.63/a.php #通過調用 phpinfo()凼數來查看

[root@silence80 memcache-2.2.7]# cat /server/nginx-1.2.8/html/a.php

<?php

phpinfo();

?>

查看 memcache 相關內容,注:沒有添加時,是看不到的

wKioL1XHaAXTuRxPAAKrjyA47Xg725.jpg

[root@silence80 ~]# vim /server/php-5.4-nginx/php.ini

在:

728 ; extension_dir = "./"   #在 php.ini 中;表示註釋 追加:

extension_dir = "/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/"

extension=memcache.so

[root@silence80 ~]# ls

/server/php-5.4-nginx/lib/php/extensions/no-debug-non-zts-20100525/

memcache.so

#能看到 memcache.so



重新啓動 php-fpm

[root@silence80 ~]# /etc/init.d/php-fpm restart 

Gracefully shutting down php-fpm . done 

Starting php-fpm   done




測試

1) 查看 phpinfo.php  是否有 memcache 選項

訪問:http://192.168.1.63/a.php ,查看 memcache 相關內容,注:沒有添加時,是看不到的


wKioL1XHaKLxN2JJAAH5uJTjlfI436.jpg

2) memcache  memcached 的連接寫一個 php 頁面

[root@silence80~]# vim /server/nginx-1.2.8/html/mem.php  #寫入以下內容

<?php

 

 

$memcache = memcache_connect('192.168.1.63', 11211);

 

 

$memcache->set( 'test' , 'hello world!' , 0 , 12 );

$val =   $memcache->get( 'test' );

echo $val;

?>

 

 

注:0 表示 memcache 緩存過期時間,  12 表示 test 可以存儲字節數

 

 

訪問:http://192.168.1.63/mem.php ,可以看到 hello world!  說明成功

wKiom1XHZzTwEzUxAAEHJHCwDy4770.jpg

實戰 3:開始緩存 mysql 數據



[root@silence80 ~]# /etc/init.d/mysqld5.5 restart

Shutting down MySQL.. [   OK   ] 

Starting MySQL.... [   OK   ]



產生測試數據:

seq 命令: 用於產生從某個數到另外一個數之間的所有整數 

[root@silence80 ~]# seq 1 99999 > /tmp/big

[root@silence80 ~]# tail   /tmp/big

99990

99991

99992

99993

99994

99995

99996

99997

99998

99999



將生成的數據導入到 msyql 數據庫:



[root@silence80 ~]# mysql -uroot -p123456   -e "create database db1"

[root@silence80 ~]# mysql -uroot -p123456 -e "use db1;create table T1(ID

int)ENGINE=innodb"

[root@silence80 ~]# mysql -uroot -p123456 -e "use db1;load data infile '/tmp/big' into table T1"

注:LOAD DATA INFILE 詫句以很高的速度從一個文本文件中讀取行到一個表中,因此文件中行的內容 要和表的列相符。相關文件名必須是一個文字字符串。


上傳腳本到/var/www/html下

wKiom1XHaDayrESKAAF3De7aQsc760.jpg

訪問測試頁面:

http://192.168.1.63/memcached_page/

如果顯示不正常,調一下編碼

wKioL1XHaqmBNm2yAAGM1nyRjBQ671.jpg

讀測試

wKiom1XHaVrRTkK9AAGjUYCN4ps802.jpg

wKioL1XHa-mw45foAAH1lSkN7zM791.jpg

寫測試

wKioL1XHbCui9bs0AAKH6ty8dzM406.jpg


寫完之後到讀測試那邊去查詢

wKiom1XHanGAgJdZAAH0QmBq3mw254.jpg


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