Memcached
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。
memcache 是一個 C/S 結構server 端:memcachedclient 端:memcache
運行模式: C/S
端口號:11211
[root@silence80 ~]# vim /etc/services
作用:
memcached 可以緩存 mysql 的查詢結果,優化 mysql I/O。
運行機制: 普通情況:
user ->web->mysql
使用 memcache 情況:
user->web ->memcache->mysql
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 相關內容,注:沒有添加時,是看不到的
[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 相關內容,注:沒有添加時,是看不到的
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! 說明成功
實戰 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下
訪問測試頁面:
http://192.168.1.63/memcached_page/
如果顯示不正常,調一下編碼
讀測試
寫測試
寫完之後到讀測試那邊去查詢