linux伺服器歷險之使用memcached
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
一,為什麼要使用memcached最優秀的cache軟體,有效減輕資料庫伺服器的壓力
不用它還要用哪個?
二,下載
從何處下載?
http://www.danga.com/memcached/
libevent從何處下載?
http://monkey.org/~provos/libevent/
php的memcache模組下載:
http://pecl.php.net/package/memcache/download/
三,如何進行安裝libevent?
tar -zxvf libevent-1.3e.tar.gz
./configure --prefix=/usr
make
make install
四,檢查libevent安裝是否成功?
[
lrwxrwxrwx 1 root root 22 Oct 6 00:20 libevent-1.1a.so.1 -> libevent-1.1a.so.1.0.2
-rwxr-xr-x 1 root root 31596 Jan 7 2007 libevent-1.1a.so.1.0.2
lrwxrwxrwx 1 root root 22 Oct 6 00:36 libevent-1.3e.so.1 -> libevent-1.3e.so.1.0.3
-rwxr-xr-x 1 root root 338439 Oct 6 00:36 libevent-1.3e.so.1.0.3
-rw-r--r-- 1 root root 533978 Oct 6 00:36 libevent.a
-rwxr-xr-x 1 root root 828 Oct 6 00:36 libevent.la
lrwxrwxrwx 1 root root 22 Oct 6 00:36 libevent.so -> libevent-1.3e.so.1.0.3
五,安裝memcached
tar -zxvf memcached-1.2.2.tar.gz
安裝memcached時,需要指定libevent的安裝位置:
./configure --with-libevent=/usr --enable-threads
# make
# make install
六,檢查memcached安裝是否成功?
1看檔案
[
-rwxr-xr-x 1 root root 141771 Oct 6 00:41 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 151317 Oct 6 00:41 /usr/local/bin/memcached-debug
2,測試執行
[[email protected] memcached-1.2.2]# /usr/local/bin/memcached -h
/usr/local/bin/memcached: error while loading shared libraries: libevent-1.3e.so.1: cannot open shared object file: No such file or directory
出錯了,怎麼辦?
進行檢查
[
4962: find library=libevent-1.3e.so.1 [0]; searching
4962: search cache=/etc/ld.so.cache
4962: search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64 (system search path)
4962: trying file=/lib64/tls/x86_64/libevent-1.3e.so.1
4962: trying file=/lib64/tls/libevent-1.3e.so.1
4962: trying file=/lib64/x86_64/libevent-1.3e.so.1
4962: trying file=/lib64/libevent-1.3e.so.1
4962: trying file=/usr/lib64/tls/x86_64/libevent-1.3e.so.1
4962: trying file=/usr/lib64/tls/libevent-1.3e.so.1
4962: trying file=/usr/lib64/x86_64/libevent-1.3e.so.1
4962: trying file=/usr/lib64/libevent-1.3e.so.1
4962:
memcached: error while loading shared libraries: libevent-1.3e.so.1: cannot open shared object file: No such file or directory
進行處理:
[[email protected] memcached-1.2.2]# ln -s /usr/lib/libevent-1.3e.so.1 /usr/lib64/libevent-1.3e.so.1
[[email protected] memcached-1.2.2]# memcached -h
memcached 1.2.2
-p <num> TCP port number to listen on (default: 11211)
-U <num> UDP port number to listen on (default: 0, off)
-s <file> unix socket path to listen on (disables network support)
-l <ip_addr> interface to listen on, default is INDRR_ANY
-d run as a daemon
-r maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num> max memory to use for items in megabytes, default is 64 MB
-M return error on memory exhausted (rather than removing items)
-c <num> max simultaneous connections, default is 1024
-k lock down all paged memory
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-h print this help and exit
-i print memcached and libevent license
-b run a managed instanced (mnemonic: buckets)
-P <file> save PID in <file>, only used with -d option
-f <factor> chunk size growth factor, default 1.25
-n <bytes> minimum space allocated for key+value+flags, default 48
至此安裝完畢
七,如何啟動memcached的服務端?
下面,我們來啟動一個Memcached的伺服器端:
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -m 128 -l localhost -p 11211 -u root
-d 以守護程式(daemon)方式執行 memcached;
-m 設定 memcached 可以使用的記憶體大小,單位為 M;
-l 設定監聽的 IP 地址,如果是本機的話,通常可以不設定此引數;
-p 設定監聽的埠,預設為 11211,所以也可以不設定此引數;
-u 指定使用者;
-t <num> number of threads to use, default 4
如果有此項,說明已經支援了執行緒,就可以在啟動的時候使用 -t 選項來啟動多執行緒
然後啟動的時候必須加上你需要支援的執行緒數量:
/usr/local/memcache/bin/memcached -t 1024
[[email protected] memcached-1.2.2]# /usr/local/bin/memcached -d -m 128 -l localhost -p 11211 -u root
Illegal address: localhost
[[email protected] memcached-1.2.2]# /usr/local/bin/memcached -d -m 128 -l 127.0.0.1 -p 11211 -u root
[[email protected] memcached-1.2.2]#
至此啟動成功
八,memcached的相關知識?
如何停止?如何重啟?如何重新整理其內容?等等
使用這個檔案來實現:
#! /bin/sh
#
# chkconfig: - 55 45
# description: The memcached daemon is a network memory cache service.
# processname: memcached
# config: /etc/sysconfig/memcached
# Source function library.
. /etc/rc.d/init.d/functions
PORT1=11211
USER=nobody
MAXCONN=1024
CACHESIZE=64
OPTIONS="-t 8"
MEMDAEMON=/usr/local/bin/memcached
if [ -f /etc/sysconfig/memcached ];then
. /etc/sysconfig/memcached
fi
# Check that networking is up.
if [ "$NETWORKING" = "no" ]
then
exit 0
fi
RETVAL=0
prog="memcached"
start () {
echo -n $"Starting $prog: "
# insure that /var/run/memcached has proper permissions
#chown $USER /var/run/memcached
daemon $MEMDAEMON -d -p $PORT1 -u $USER -m $CACHESIZE -c $MAXCONN $OPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/memcached
}
stop () {
echo -n $"Stopping $prog: "
killproc memcached
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then
rm -f /var/lock/subsys/memcached
rm -f /var/run/memcached.pid
fi
}
restart () {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status memcached
;;
restart|reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/memcached ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}"
exit 1
esac
exit $?
九:配置php能訪問memcached
wget http://pecl.php.net/get/memcache-2.2.0.tgz
tar -zxvf memcache-2.2.0.tgz
[[email protected] memcache-2.2.0]# /usr/local/bin/phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20050922
Zend Extension Api No: 220051025
Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF
environment variable is set correctly and then rerun this script.
沒有autoconf
yum install autoconf
[[email protected] memcache-2.2.0]# yum install autoconf
[[email protected] memcache-2.2.0]# /usr/local/bin/phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20050922
Zend Extension Api No: 220051025
[[email protected] memcache-2.2.0]# ./configure --enable-memcache --with-php-config=/usr/local/bin/php-config --with-zlib-dir
make
[[email protected] memcache-2.2.0]# make install
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20050922/
至此安裝成功
下面我們需把此安裝成功的模組新增到php中去
vi php.ini
add下面的這兩行
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20050922/"
extension=memcache.so
然後重啟apache
用phpinfo()看到存在以下資訊,則表示模組安裝成功
memcache
memcache support | enabled |
---|---|
Active persistent connections | 0 |
Revision | $Revision: 1.86 $ |
Directive | Local Value | Master Value |
---|---|---|
memcache.allow_failover | 1 | 1 |
memcache.chunk_size | 8192 | 8192 |
memcache.default_port | 11211 | 11211 |
memcache.hash_function | crc32 | crc32 |
memcache.hash_strategy | standard | standard |
memcache.max_failover_attempts | 20 | 20 |
十:編寫php程式碼測試訪問memcached
[ 介面介紹 ]
服 務器端和客戶端都安裝配置好了,現在我們就來測試以下我們的成果。Memcache客戶端包含兩組介面,一組是面向過程的介面,一組是面向物件的介面,具 體可以參考PHP手冊 “LXXV. Memcache Functions” 這章。我們為了簡單方便,就使用面向物件的方式,也便於維護和編寫程式碼。Memcache面向物件的常用介面包括:
Memcache::connect -- 開啟一個到Memcache的連線
Memcache::pconnect -- 開啟一個到Memcache的長連線
Memcache::close -- 關閉一個Memcache的連線
Memcache::set -- 儲存資料到Memcache伺服器上
Memcache::get -- 提取一個儲存在Memcache伺服器上的資料
Memcache::replace -- 替換一個已經存在Memcache伺服器上的專案(功能類似Memcache::set)
Memcache::delete -- 從Memcache伺服器上刪除一個儲存的專案
Memcache::flush -- 重新整理所有Memcache伺服器上儲存的專案(類似於刪除所有的儲存的專案)
Memcache::getStats -- 獲取當前Memcache伺服器執行的狀態
示例程式:
<?php
//連線
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
//儲存資料
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br>";
//替換資料
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
//儲存陣列
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//刪除資料
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
//清除所有資料
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//關閉連線
$mem->close();
?>
如果正常的話,瀏覽器將輸出:
Get key1 value: This is first value
Get key1 value: This is replace value
Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
Get key1 value:
Get key2 value:
<?php
/*
測試memcache快取mysql的查詢結果
by hd
2007.10.06
*/
//定義訪問資料庫的常量
define(SERVER_DATA_HOST,"127.0.0.1");
define(SERVER_DATA_USER,"root");
define(SERVER_DATA_PASS,"");
define(SERVER_DATA_BASE,"liuyan");
//定義訪問資料庫的常量
define(SERVER_MEM_HOST,"127.0.0.1");
define(SERVER_MEM_PORT,"11211");
//建立到資料庫的連線
$dblink=mysql_connect(SERVER_DATA_HOST,SERVER_DATA_USER,SERVER_DATA_PASS);
mysql_select_db(SERVER_DATA_BASE,$dblink);
//定義到快取的連結
$memlink = memcache_connect(SERVER_MEM_HOST,SERVER_MEM_PORT);
//定義訪問資料庫的函式
function sqlres($sqlstr)
{
global $dblink;
global $memlink;
$memstr = md5($sqlstr);
$memres = array();
if(!$memlink->get($memstr))
{
$dbres = mysql_query($sqlstr,$dblink);
$arrdata=array();
while ($dbrow = mysql_fetch_assoc($dbres))
{
$arrdata[]=$dbrow;
}
$memlink->set($memstr,$arrdata);
}
else
{
$memres = $memlink->get($memstr);
}
return $memres;
}
$sqlstr="select * from rank";
$arrdata=sqlres($sqlstr);
print_r($arrdata);
?>
十一:需要注意的問題
十一:封裝一個訪問memcached的類供呼叫
十一: