天天看點

memcache

Memcached

Memcached 是一個高性能的分布式記憶體對象緩存系統,用于動态Web應用以減輕資料庫負載。它通過在記憶體中緩存資料和對象來減少讀取資料庫的次數,進而提高動态、資料庫驅動網站的速度。Memcached基于一個存儲鍵/值對的hashmap。其守護程序(daemon )是用C寫的,但是用戶端可以用任何語言來編寫,并通過memcached協定與守護程序通信。

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

運作模式: C/S

端口号:11211

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

memcache

作用:

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

 運作機制: 普通情況:

user ->web->mysql

memcache

使用 memcache 情況:

user->web  ->memcache->mysql

memcache

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 相關内容,注:沒有添加時,是看不到的

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 相關内容,注:沒有添加時,是看不到的

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!  說明成功

memcache

實戰 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下

memcache

通路測試頁面:

http://192.168.1.63/memcached_page/

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

memcache
讀測試
memcache
memcache

寫測試

memcache