LAMMP环境的搭建
实验环境:
CentOS6.4 32位系统
VMware workstation 10
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用
任何语言来编写,并通过memcached协议与守护进程通信。
memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款
软件。已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重
要因素。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着
数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影
响。
Memcached是一款开发工具,它既不是一个代码加速器,也不是数据库中间件。其设计哲学思想主要
反映在如下方面:
1. 简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项
由“键、过期时间、可选的标志及数据”四个部分组成;
2. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端
获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超
时过期;
3. 各服务器间彼此之间不互相通信:不在服务器间进行数据同步;服务器宕机,存储的数据立即丢
失
4. O/I的执行效率
5. 清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数
据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,
memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长
具体的实施步骤:
安装之前我们要先确认自己的系统是否已经安装了Apache,如果有rpm包安装的要卸载,如图
在我们的web服务器(Apache)上分别安装两块网卡,(此时,你两块网卡可以在同一网段,也可以
不再),注意,在虚拟机上安装网卡时可能会出现错误,如,setup之后ifconfig只出现一块eth1或
eth0的某一块网卡,这时,我们还要在虚拟机(设置中)上另外添加上setup上添加的那块网卡,之
后还可能会出现两块或一块都没有地址的情况,这时我们要用ifconfig eth0/1 x.x.x.x 来再加一
次地址
当然,在此次实验中你也可以将Apache服务器设在同一网段,也可以达到实验效果,只不过不同网段更能体现出服务器间彼此分离的概念(本例虽然Apache服务器有两块网卡,但用的其实是eth0网卡,eth1只做介绍用)
Apache和php安装
和以前安装Apache的方法类似,我们要先安装apr 再安装apr-utils,具体的编译参数并不多,而具
体的头文件,库文件,man手册的操作,大家可参阅《Apache的源码包安装》
[root@localhost ~]# tar -zxvf apr-1.4.6.tar.gz -C /usr/local/src
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# cd ./apr-1.4.6/
[root@localhost apr-1.4.6]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.4.6]# make && make install
在apr安装完成之后,生产编译要用的文件的时候有一步老是报错,整了好长时间,可没脾气,最后
发现还是疏忽大意造成的,错误的原因为
[root@localhost apr-util-1.5.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-congfig
正确为
[root@localhost ~]tar -zxvf apr-util-1.5.1.tar.gz -C /usr/local/src
[root@localhost apr-1.4.6]# cd ..
[root@localhost src]# cd ./apr-util-1.5.1/
[root@localhost apr-util-1.5.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-config
[root@localhost ~]# cd /usr/local/src/apr-util-1.5.1/
[root@localhost apr-util-1.5.1]# make && make install
因为在以后的httpd安装中要用到--with-pcre 而我们可以用 rpm -qa pcre查看并安装
[root@localhost apr-util-1.5.1]# rpm -qa pcre
pcre-7.8-6.el6.i686
[root@localhost apr-util-1.5.1]# rpm -qa libevent
[root@localhost apr-util-1.5.1]# rpm -qa pcre-devel
[root@localhost apr-util-1.5.1]# yum --disablerepo=\* --enablerepo=c6-media install
pcre-devel
然后是httpd的配置编译,具体命令如图,参数如下
[root@localhost ~]tar -jxvf httpd-2.4.4.tar.bz2 -C /usr/local/src
./configure --prefix=/usr/local/apache \
--sysconfdir=/etc/httpd \
--enable-so \
--enable-rewrite \
--with-apr=/usr/local/apr/bin/apr-1-config \
--with-apr-util=/usr/local/apr-util/bin/apu-1-config \
--with-pcre \
-with-z \
--enable-mpms-shared=all \
--with-mpm=event
[root@localhost httpd-2.4.4]# make && make install
然后编写程序的控制脚本,并加入chkconfig的管理,内容如下:
#!/bin/bash
prog=/usr/local/apache/bin/httpd
lockfile=/var/lock/subsys/httpd
# chkconfig: 2345 88 44
# description: the httpd server
start () {
if [ -e $lockfile ]; then
echo "the httpd is started"
else
echo "the httpd is starting..."
sleep 1
$prog -k start &>/dev/null && echo "ok" && touch $lockfile || echo "fail"
fi
}
stop () {
if [ ! -e $lockfile ] ; then
echo "the httpd is stoped"
else
echo "the httpd is stoping...."
sleep 1
$prog -k stop &>/dev/null && echo "ok" && rm -rf $lockfile || echo "file"
fi
}
status () {
if [ -e $lockfile ]; then
echo "the http is runing....."
else
echo "the httpd is stop"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "usage {start|stop|restart}"
esac
[root@localhost init.d]# vim /etc/init.d/httpd
[root@localhost init.d]# chmod a+x httpd
启动Apache服务,但在此之前我们要先改一下配置文件中的主机名选项
[root@localhost init.d]# service httpd start
the httpd is starting...
ok
[root@localhost init.d]# netstat -tupln |grep 80
tcp 0 0 :::80 :::* LISTEN
3510/httpd
在测试之前一定要记得关闭selinux和防火墙
[root@localhost init.d]# setenforce 0
[root@localhost init.d]# service iptables stop
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]
[root@localhost init.d]#
安装php之前,我们要先建两个编译时要用的目录
[root@localhost ~]# mkdir -pv /etc/php /etc/php5.d
mkdir: created directory `/etc/php'
mkdir: created directory `/etc/php5.d'
[root@localhost ~]# tar -jxvf php-5.5.8.tar.bz2 -C /usr/local/src
[root@localhost php-5.5.8]# ./configure \
> --prefix=/usr/local/php \
> --enable-fpm \
> --enable-sockets \
> --with-mysql=mysqlnd \
> --with-mysqli=mysqlnd \
> --with-pdo-mysql=mysqlnd \
> --enable-mbstring \
> --enable-xml \
> --with-png-dir \
> --with-jpeg-dir \
> --with-zlib \
> --with-freetype-dir \
> --with-config-file-path=/etc/php \
> --with-config-file-scan-dir=/etc/php5.d
configure: error: xml2-config not found. Please check your libxml2 installation.
[root@localhost php-5.5.8]# rpm -qa libxml2
libxml2-2.7.6-8.el6_3.4.i686
[root@localhost php-5.5.8]# yum --disablerepo=\* --enablerepo=c6-media install
libxml2-devel
Installed:
libxml2-devel.i686 0:2.7.6-8.el6_3.4
Dependency Installed:
zlib-devel.i686 0:1.2.3-29.el6
Complete!
重复上一步./configure 操作,然后
[root@localhost php-5.5.8]# make && make install
编译安装完后进行php.ini的文件配置
进入源码目录
[root@localhost php-5.5.8]# cp php.ini-production /etc/php/php.ini
php-fpm的控制脚本
[root@localhost php-5.5.8]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
改变权限
[root@localhost php-5.5.8]# chmod a+x /etc/init.d/php-fpm
[root@localhost php-5.5.8]# cd /usr/local/php/etc/
产生php-fpm的配置文件
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
启动php-fpm
[root@localhost etc]# service php-fpm start
Starting php-fpm done
[root@localhost etc]# chkconfig --add php-fpm
[root@localhost etc]# chkconfig php-fpm on
[root@localhost etc]# netstat -tupln |grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
5063/php-fpm
在php和fastcgi配置完成后要完成Apache与php的结合,原理为当客户发出一个80端口请求的时候,
当Apache发现请求的为php页面的时候会把他转发至9000端口(即fastcgi),这一功能的完成靠的是
一个模块,该模块将作用类似将其变为一种dso
将有关的模块加载控制字段打开,如图
并添加一下两行语句
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
添加代理的匹配规则,编写测试页面并重启Apache
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1
[root@localhost etc]# vim /usr/local/apache/htdocs/index.php
[root@localhost etc]# service httpd restart
the httpd is stoped
the httpd is starting...
ok
测试
为php加入加速功能,安装xcache
[root@localhost ~]# tar -zxvf xcache-3.1.0.tar.gz -C /usr/local/src/
利用phpize将其做成php的扩展模块
之后可以用./configure --help 来查看有关的参数帮助,因为他是php的模块,所以不需要额外指
明它的安装目录
[root@localhost ~]# cd /usr/local/src/xcache-3.1.0/
[root@localhost xcache-3.1.0]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
[root@localhost xcache-3.1.0]# ./configure --enable-xcache --with-php-
config=/usr/local/php/bin/php-config
[root@localhost xcache-3.1.0]# make && make install
在安装完成之后会在/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/目录下
生成.so文件,如图
[root@localhost xcache-3.1.0]# cp xcache.ini /etc/php5.d/
[root@localhost xcache-3.1.0]# cd /etc/php5.d
[root@localhost php5.d]# vim xcache.ini
[root@localhost php5.d]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
[root@localhost php5.d]# vim /usr/local/apache/htdocs/index.php
页面测试:
(此时你也可以加入xcache的管理页面,也可不加入,方法为
xcache的管理:
拷贝admin目录到Apache的站点目录
改变目录和文件的权限
配置xcache.ini 输入帐号信息
)
在配置memcached服务器之前要在Apache服务器安装memcached服务器的api插件(与xcache类似)
[root@localhost ~]# tar -zxvf memcache-2.2.7.tgz -C /usr/local/src
[root@localhost src]# cd ./memcache-2.2.7/
[root@localhost memcache-2.2.7]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
[root@localhost memcache-2.2.7]# ./configure --enable-memcache --with-php-
config=/usr/local/php/bin/php-config
[root@localhost memcache-2.2.7]# make && make install
这时你可以选择将该文件加入/etc/php/php.ini文件下,也可以加入到/etc/php5.d/xcache.ini文
件下,然后重启php服务
[root@localhost memcache-2.2.7]# vim /etc/php5.d/xcache.ini
[root@localhost memcache-2.2.7]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
然后利用浏览器进行测试,结果如图
MySQL的安装
本次实验的MySQL服务器也将和Apache处于不同的物理机器上,我们先以MySQL的绿色软件包安装为例安装MySQL,然后进行测试(php和mysql的连接)
地址规划:
[root@localhost ~]# tar -zxvf mysql-5.5.35-linux2.6-i686.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/
[root@localhost local]# ls
bin etc games include lib libexec mysql-5.5.35-linux2.6-i686 sbin share src
[root@localhost local]# ln -s mysql-5.5.35-linux2.6-i686/ mysql
[root@localhost local]# ll
total 40
drwxr-xr-x. 2 root root 4096 Sep 23 2011 bin
drwxr-xr-x. 2 root root 4096 Sep 23 2011 etc
drwxr-xr-x. 2 root root 4096 Sep 23 2011 games
drwxr-xr-x. 2 root root 4096 Sep 23 2011 include
drwxr-xr-x. 2 root root 4096 Sep 23 2011 lib
drwxr-xr-x. 2 root root 4096 Sep 23 2011 libexec
lrwxrwxrwx. 1 root root 27 Feb 9 17:43 mysql -> mysql-5.5.35-linux2.6-i686/
drwxr-xr-x. 13 root root 4096 Feb 9 17:42 mysql-5.5.35-linux2.6-i686
drwxr-xr-x. 2 root root 4096 Sep 23 2011 sbin
drwxr-xr-x. 5 root root 4096 Jan 18 06:22 share
drwxr-xr-x. 2 root root 4096 Sep 23 2011 src
主要大致步骤
shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data
# Next command is optional
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> bin/mysqld_safe --user=mysql &
mysqld和mysqld_safe 有什么区别?
直接运行mysqld程序来启动MySQL服务的方法很少见,mysqld_safe脚本会在启动MySQL服务器后继续
监控其运行情况,并在其死机时重新启动它。用mysqld_safe脚本来启动MySQL服务器的做法在BSD风
格的unix系统上很常见,非BSD风格的UNIX系统中的mysql.server脚本其实也是调用mysqld_safe脚
本去启动MySQL服务器的。
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server
[root@localhost mysql]# groupadd mysql
[root@localhost mysql]# useradd -r -g mysql mysql
[root@localhost mysql]# chown -R mysql .
[root@localhost mysql]# chgrp -R mysql .
[root@localhost mysql]# scripts/mysql_install_db --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
root@localhost mysql]# ll ./data/
total 4
drwxr-xr-x. 2 mysql mysql 4096 Feb 9 17:40 test
(没有初始化授权表格的出现,这也是下面将会出现错误的原因,会提示找不到pid文件)
[root@localhost mysql]# chown -R root .
[root@localhost mysql]# chown -R mysql data
[root@localhost mysql]# cp support-files/my-medium.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# chmod a+x /etc/init.d/mysqld
[root@localhost mysql]# service mysqld start
Starting MySQL.... ERROR! The server quit without updating PID file
(/usr/local/mysql/data/localhost.localdomain.pid).
[root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
[1] 3303
[root@localhost mysql]# 140209 18:03:51 mysqld_safe Logging to
'/usr/local/mysql/data/localhost.localdomain.err'.
140209 18:03:51 mysqld_safe Starting mysqld daemon with databases from
/usr/local/mysql/data
140209 18:03:52 mysqld_safe mysqld from pid file
/usr/local/mysql/data/localhost.localdomain.pid ended
[1]+ Done /usr/local/mysql/bin/mysqld_safe --user=mysql
[root@localhost mysql]# service mysqld status
ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists
[root@localhost mysql]# service mysqld restart
ERROR! MySQL server PID file could not be found!
Starting MySQL.. ERROR! The server quit without updating PID file
(/usr/local/mysql/data/localhost.localdomain.pid).
在这一步是有错误的(32位系统上小编发现都会出现这种错误),原因很可能是上几步执行scripts/mysql_install_db --user=mysql 时产生不了数据库的初始化运行者(mysql)表的原因,但在继续改变身份(组)后运行scripts/mysql_install_db --user=mysql是可以产生表的
[root@localhost mysql]# chown -R mysql .
[root@localhost mysql]# chgrp -R mysql .
[root@localhost mysql-5.5.35-linux2.6-i686]# scripts/mysql_install_db --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
[root@localhost mysql-5.5.35-linux2.6-i686]# cd ./data
[root@localhost data]# ll
total 29776
-rw-rw----. 1 mysql mysql 18874368 Feb 9 18:00 ibdata1
-rw-rw----. 1 mysql mysql 5242880 Feb 9 18:05 ib_logfile0
-rw-rw----. 1 mysql mysql 5242880 Feb 9 17:59 ib_logfile1
-rw-r-----. 1 mysql mysql 5692 Feb 9 18:05 localhost.localdomain.err
drwx------. 2 mysql root 4096 Feb 9 18:13 mysql
-rw-rw----. 1 mysql mysql 107 Feb 9 18:00 mysql-bin.000001
-rw-rw----. 1 mysql mysql 107 Feb 9 18:03 mysql-bin.000002
-rw-rw----. 1 mysql mysql 107 Feb 9 18:05 mysql-bin.000003
-rw-rw----. 1 mysql mysql 27735 Feb 9 18:13 mysql-bin.000004
-rw-rw----. 1 mysql mysql 1062964 Feb 9 18:13 mysql-bin.000005
-rw-rw----. 1 mysql mysql 95 Feb 9 18:13 mysql-bin.index
drwx------. 2 mysql mysql 4096 Feb 9 18:13 performance_schema
drwxr-xr-x. 2 mysql mysql 4096 Feb 9 17:40 test
[root@localhost data]# pkill mysqld
[root@localhost data]# service mysqld restart
ERROR! MySQL server PID file could not be found(上一次pid的原因)
Starting MySQL... SUCCESS! (成功启动)
[root@localhost data]# service mysqld status
SUCCESS! MySQL running (4338)
[root@localhost data]# ps aux |grep mysq*
Binary file mysql-bin.000004 matches
Binary file mysql-bin.000005 matches
mysql-bin.index:./mysql-bin.000001
mysql-bin.index:./mysql-bin.000002
mysql-bin.index:./mysql-bin.000003
mysql-bin.index:./mysql-bin.000004
mysql-bin.index:./mysql-bin.000005
mysql-bin.index:./mysql-bin.000006
[root@localhost data]# service mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
[root@localhost data]# service mysqld stop
Shutting down MySQL. SUCCESS!
[root@localhost data]# service mysqld start
Starting MySQL.. SUCCESS!
[root@localhost data]#
在MySQL安装完成之后默认只允许在本机上进行连接操作,其他不允许,所以我们要添加额外的管理
账号,我们需要在user表格中写入有关数据
过程如图所示
其中%表示可以来自任意地址
编写数据库的连接测试页,
并用浏览器测试,(一定要注意关闭selinux和防火墙设置)
[root@localhost data]# setenforce 0
[root@localhost data]# service iptables stop
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]
[root@localhost data]# service mysqld status
SUCCESS! MySQL running (5054)
[root@localhost data]# service mysqld stop
Shutting down MySQL..... SUCCESS
几种常见错误解决:
《一》 Starting MySQL.. ERROR! The server quit without updating PID file
(/usr/local/mysql/data/localhost.l源目录安装mysql5.5.19后,把mysql.server放
到/etc/init.d/下,使用service mysql start|restart|stop来控制mysql,结果报以下错误:
Starting MySQL.. ERROR! The server quit without updating PID file
(/usr/local/mysql/data/localhost.localdomain.pid)
解决方法:
问题点:权限不足。。。
解决方法:编辑/etc/init.d/mysql,找到start模块,添加--user=root到mysqld_safe。。。后面
就可以
《二》,[root@centos var]# service mysqld stop
MySQL manager or server PID file could not be found! [FAILED]
解决办法:
首先查看一下进程
[root@irxpert-test /]# ps aux |grep mysq*
root 10274 0.0 0.0 68160 1336 ? S 13:43 0:00 /bin/sh
/usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/irxpert-
test.pid
mysql 10353 0.0 1.0 344360 39464 ? Sl 13:43 0:00 /usr/sbin/mysqld -
-basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --
user=mysql --log-error=/var/lib/mysql/irxpert-test.err --pid-
file=/var/lib/mysql/irxpert-test.pid
root 11884 0.0 0.0 63384 760 pts/1 S+ 15:44 0:00 grep mysq*
如果看到上面的内容,那说明,Mysql的进程卡死了,这时用就要把这些卡死的进程都关闭
[root@centos mysql]# kill 10274
[root@centos mysql]# kill 10353
启动Mysql就ok了
[root@centos mysql]# service mysql start
Starting MySQL. [ OK ]
memcached服务器的配置步骤:
安装事件的触发库,用于与Apache服务器连接
[root@localhost ~]# tar -zxvf libevent-2.0.21-stable.tar.gz -C /usr/local/src
编译安装
[root@localhost libevent-2.0.21-stable]# ./configure --prefix=/usr/local/libevent
[root@localhost libevent]# make && make install
编译安装完之后的目录内容如图所示
编写系统库文件的加载配置文件,加入libevent的库,如图步骤
内容为:
库路径加入后的结果:
安装memcached
[root@localhost ~]# tar -zxvf memcached-1.4.17.tgr.gz -C /usr/local/src
[root@localhost ~]# cd /usr/local/src/memcached-1.4.17/
[root@localhost memcached-1.4.17]# ./configure --prefix=/usr/local/memcached --with
-libevent=/usr/local/libevent/
[root@localhost memcached-1.4.17]# make && make install
编译安装完之后的目录内容如图所示
启动memcached服务并查看端口
[root@localhost bin]# ./memcached -u nobody -m 128m -d -vv
[root@localhost bin]# netstat -tupln |grep 11211
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN
13022/./memcached
tcp 0 0 :::11211 :::* LISTEN
13022/./memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:*
13022/./memcached
udp 0 0 :::11211 :::*
13022/./memcached
测试登录,如图所示
在Apache上编写如下的memcached测试页面
[root@localhost memcache-2.2.7]# vim /usr/local/apache/htdocs/index.php
error_reporting(E_ALL & ~E_NOTICE);
$mc = new memcache;
$mc->addServer("localhost", 11211);
$mc->set("foo", "Hello!");
$mc->set("bar", "Memcached...");
$arr = array(
$mc->get("foo"),
$mc->get("bar")
);
var_dump($arr);
?>
上图的意思为在192.168.2.177的服务器上存放一个foo值 “hello” 一个bar 值“memcached”
知识补充:
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)
-p使用的TCP端口。默认为11211
-m最大内存大小。默认为64M
-vv用very vrebose模式启动,调试信息和错误输出到控制台
-d作为daemon在后台启动
查看memcached的内部状态
memcached有个名为stats的命令,使用它可以获得各种各样的信息。 执行命令的方法很多,用telnet最为简单:
$ telnet 主机名 端口号
连接到memcached之后,输入stats再按回车,即可获得包括资源利用率在内的各种信息。
此外,输入"stats slabs"或"stats items"还可以获得关于缓存记录的信息。 结束程序请输入quit。
这些命令的详细信息可以参考memcached软件包内的protocol.txt文档。
列 含义
# slab class编号
Item_Size Chunk大小
Max_age LRU内最旧的记录的生存时间
1MB_pages 分配给Slab的页数
Count Slab内的记录数
Full? Slab内是否含有空闲chunk
基于libevent的事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。
即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,
因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。 关于事件处理这里就不再详细介绍,可以参考Dan Kegel的The C10K Problem。
内置内存存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。
由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。
另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
保存数据
向memcached保存数据的方法有
1.add
2.replace
3.set
它们的使用方法都相同:
my $add = $memcached->add( '键', '值', '期限' );
my $replace = $memcached->replace( '键', '值', '期限' );
my $set = $memcached->set( '键', '值', '期限' );
向memcached保存数据时可以指定期限(秒)。不指定期限时,memcached按照LRU算法保存数据。 这三个方法的区别如下:
选项说明
add存储空间中不存在键相同的数据时才保存
replace当存储空间中存在键相同的数据时才保存
setadd和replace不同,无论何时都保存
获取数据
获取数据可以使用get和get_multi方法。
my $val = $memcached->get('键');
my $val = $memcached->get_multi('键1', '键2', '键3', '键4', '键5');
一次取得多条数据时使用get_multi。get_multi可以非同步地同时取得多个键值, 其速度要比循环调用get快数十倍。
删除数据
删除数据使用delete方法,不过它有个独特的功能。
$memcached->delete('键', '阻塞时间(秒)');
删除第一个参数指定的键的数据。第二个参数指定一个时间值,可以禁止使用同样的键保存新数据。
此功能可以用于防止缓存数据的不完整。但是要注意,set函数忽视该阻塞,照常保存数据
在Apache服务器上进行缓存192.168.2.177 memcached服务器测试,结果如图所示
为了验证我们实验浏览器端结果的正确性,我们可以在memcached服务器端进行相同的测试并比较,如图: