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 $?
啟動 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
參數:
-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:*
測試,連接配接 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.
參數說明:
#往 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
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
檢視 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
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 #寫入以下内容
$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
9×××
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/
如果顯示不正常,調一下編碼
寫測試