Memcached是一个分布式的内存对象缓存系统,通常用于动态Web应用以减轻数据库负载。

Memcached是基于一个存储键对的hashmap,当表格满了以后,就使用LRU(最近最小使用)算法机制替换掉。
Memcached使用了libevent来均衡任何数量的打开链接,使用非阻塞的网络I/O,
对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表,
因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).
 
下面具体说明在centos环境下安装memcached并结合mysql,php来测试Memcache的缓存机制
1、安装memcached 
wget http://skadns.googlecode.com/files/libevent-1.4.8-stable.tar.gz
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
 
tar xf libevent-1.4.8-stable.tar.gz
cd libevent-1.4.8-stable
./configure
make && make install
ln -sv /usr/local/lib/libevent* /usr/lib/
 
tar xf  memcached-1.4.15.tar.gz
cd memcached-1.4.15
./configure
make && make install
 
尝试启动memcached,启动方法
[root@www ~]#memcached -d -unobody -m50 -p11211 -P /tmp/memcached.pid
说明:
-d 以独立方式运行
-u 以什么用户启动
-m 占用内存大小(默认是100)
-p 监听端口号
-P 指定pid位置
不报信息就ok,netstat -tnlp查看一下
用memcached缓存mysql数据_memcached
2、为php安装memcached扩展(我是用的是php5.4.4)
[root@www ~]#wget http://pecl.php.net/get/memcache-2.2.5.tgz
[root@www ~]#tar zxvf memcache-2.2.5.tgz 
[root@www ~]#cd memcache-2.2.5/ 
[root@www ~]#/usr/local/php/bin/phpize 
[root@www ~]#./configure --with-php-config=/usr/local/php/bin/php-config 
[root@www ~]#make 
[root@www ~]#make install
在配置文件中添加memcache扩展,命令如下 
sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20100525/"\nextension = "memcache.so"#' /usr/local/php/etc/php.ini 
 
3、确定已经安装好了mysql数据库,如果没有的话,直接使用yum install mysql-server。
 
准备测试表
mysql>CREATE DATABASE 'lee';
mysql>CREATE TABLE `lee1` (
  `id` int(7) NOT NULL AUTO_INCREMENT,
  `name` char(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
插入数据,格式如下:
mysql>INSERT INTO `lee1` VALUES (1,'tom'),(2,'jim'),(3,'abc'),(4,'cde'),(5,'fgh'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03');
查看是否有数据
用memcached缓存mysql数据_缓存_02
 
4、测试
ok下面就是测试的工作了,这里有个php脚本,用于测试memcache是否缓存数据成功
需要为这个脚本添加一个只读的数据库用户,命令格式
mysql>grant select on lee.* to memcache@"%" identified by "12345";
mysql>flush privileges;
mysql>\q
 
测试脚本内容如下:
<?php
$memcachehost = '192.168.0.128';
$memcacheport = 11211;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from lee1 limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
                $conn=mysql_connect("192.168.0.128","memcache","12345");
                mysql_select_db(lee);
                $result=mysql_query($query);
                while ($row=mysql_fetch_assoc($result))
                {
                        $arr[]=$row;
                }
                $f = 'mysql';
                $memcache->add($key,serialize($arr),0,30);
                $data = $arr ;
}
else{
        $f = 'memcache';
        $data_mem=$memcache->get($key);
        $data = unserialize($data_mem);
}
echo $f;
echo "<br>";
echo "$key";
echo "<br>";
//print_r($data);
foreach($data as $a)
{
                echo "number is <b><font color=#FF0000>$a[id]</font></b>";
                echo "<br>";
                echo "name is <b><font color=#FF0000>$a[name]</font></b>";
                echo "<br>";
 
}
?>
 
访问页面测试
用memcached缓存mysql数据_缓存_03如果出现mysql表示memcached中没有内容,需要memcached从数据库中取得
再刷新页面
用memcached缓存mysql数据_memcached_04
如果有memcached标志表示这次的数据是从memcached中取得的
 
也可以通过 telnet 192.168.0.128 11211 使用memcached命令来分析是否有内容
memcached有个缓存时间默认是1分钟,过了一分钟后,memcached需要重新从数据库中取得数据
我们也可以手动删除,这时手动刷新网页,数据是会再次被缓存的

用memcached缓存mysql数据_缓存_05