memcached编译安装及缓存mysql测试

说明:
客户端第一次访问应用程序时,会到数据库(RDBMS类型)中取出数据,返回给客户端;同时也将取出的数据保存到memcached中。
第二次访问时,因为数据已经缓存,不用去数据库查询,直接从memcached取。
本文包括memcached的编译安装及测试memcached缓存mysql的情况。

实现:
1.编译安装memcaced

# yum install libevent libevent-devel -y  //memcached是基于libevent的事件处理,因此需要安装libevent
# cd /usr/local/src
# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
# tar -xvzf  memcached-1.4.5.tar.gz
# cd memcached-1.4.5
# ./configure --prefix=/usr/local/memcached
# make && make install

 
2.开启memcached守护进程

# /usr/local/memcached/bin/memcached -d -m 64 -u root -l 192.168.6.191 -p 11211 -c 64 -P /tmp/memcached.pid
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,我这里使用默认端口11211,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

 
3.新建mysql数据库test,及表personal_info,用于测试

# /usr/local/mysql/bin/mysql -uroot -p
> create database test;  //创建测试数据库test,创建空数据表personal_info
> CREATE TABLE `personal_info` (
`pi_id` bigint(20) NOT NULL auto_increment,
`pi_name` varchar(50) NOT NULL,
`pi_tel` varchar(15) default NULL,
`pi_qq` varchar(15) default NULL,
`pi_email` varchar(50) default NULL,
PRIMARY KEY (`pi_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
> INSERT INTO `mydb`.`personal_info` (`pi_id`,`pi_name` ,`pi_tel` ,`pi_qq` ,`pi_email`)
VALUES ('1', 'eric', '13611031222', '55555555', 'eric@nginxs.com');  //插入数据

 
4.在站点目录下新建mysql-memcache.php,用于显示是从memcached读数据,还是从mysql读数据

# cat /home/www/mysql-memcache.php //内容如下
connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from personal_info limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
        $conn=mysql_connect("localhost","root","yourpasswd");
        mysql_select_db(test);
        $result=mysql_query($query);
        while ($row=mysql_fetch_assoc($result))
        {
            $arr[]=$row;
        }
        $f = 'mysql';
        $memcache->add($key,serialize($arr),0,30);    //mysql查询后,插入memcached
        $data = $arr ;
}
else{
    $f = 'memcache';
    $data_mem=$memcache->get($key);
    $data = unserialize($data_mem);
}
echo $f;
echo "
"; //print_r($data); foreach($data as $a) { echo "number is $a[pi_id]"; echo "name is $a[pi_name]"; echo "tel is $a[pi_tel]"; echo "qq is $a[pi_qq]"; echo "email is $a[pi_email]"; } ?>

 
测试:
第一次访问会提示mysql

后面访问,就会提示memcache


附录:
附录1.memcached高效的原因
那么memcached的快速和高效率是如何体现出来的呢?我们都清楚,RDBMS是文件型的数据库,最终还是以文件的形式保存在磁盘上。而memcached则不一样,它是key:value关系型的数据库,是保存在内存中。内存的读写速度要比磁盘的读写速度快得多,前者是后者的10的6次方倍。

附录2.libevent简单说明
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

发表评论

邮箱地址不会被公开。 必填项已用*标注