用memcached缓存mysql数据
2012-11-01 16:54
190 查看
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查看一下
![](http://img1.51cto.com/attachment/201211/165112534.png)
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');
查看是否有数据
![](http://img1.51cto.com/attachment/201211/165013979.png)
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>";
}
?>
访问页面测试
![](http://img1.51cto.com/attachment/201211/164744328.png)
如果出现mysql表示memcached中没有内容,需要memcached从数据库中取得
再刷新页面
![](http://img1.51cto.com/attachment/201211/164843185.png)
如果有memcached标志表示这次的数据是从memcached中取得的
也可以通过 telnet 192.168.0.128 11211 使用memcached命令来分析是否有内容
memcached有个缓存时间默认是1分钟,过了一分钟后,memcached需要重新从数据库中取得数据
我们也可以手动删除,这时手动刷新网页,数据是会再次被缓存的
![](http://img1.51cto.com/attachment/201211/164859812.png)
本文出自 “明日香” 博客,请务必保留此出处http://leezqang.blog.51cto.com/1525874/1047014
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查看一下
![](http://img1.51cto.com/attachment/201211/165112534.png)
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');
查看是否有数据
![](http://img1.51cto.com/attachment/201211/165013979.png)
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>";
}
?>
访问页面测试
![](http://img1.51cto.com/attachment/201211/164744328.png)
如果出现mysql表示memcached中没有内容,需要memcached从数据库中取得
再刷新页面
![](http://img1.51cto.com/attachment/201211/164843185.png)
如果有memcached标志表示这次的数据是从memcached中取得的
也可以通过 telnet 192.168.0.128 11211 使用memcached命令来分析是否有内容
memcached有个缓存时间默认是1分钟,过了一分钟后,memcached需要重新从数据库中取得数据
我们也可以手动删除,这时手动刷新网页,数据是会再次被缓存的
![](http://img1.51cto.com/attachment/201211/164859812.png)
本文出自 “明日香” 博客,请务必保留此出处http://leezqang.blog.51cto.com/1525874/1047014
相关文章推荐
- 分析Memcached客户端如何把缓存数据分布到多个服务器上
- 将MySQL数据映射到Memcached中
- 将MySQL数据映射到Memcached中
- 在php中操作memcached缓存进行增删改查数据
- 将MySQL数据映射到Memcached中
- xmemcached使用,并读取memcached服务器上所有的缓存数据
- 清除memcached缓存数据的方式
- Memcached和Redis数据缓存系统
- 分析Memcached客户端如何把缓存数据分布到多个服务器上-1
- 获取memcached缓存对象数量,统计在线用户数据量
- 第三十一天 MySQL并发控制、存储引擎介绍、用户权限管理、缓存管理和数据类型选择
- 将MySQL数据映射到Memcached中
- 将MySQL数据映射到Memcached中[转载]
- 清空memcached中缓存的数据的方法
- 修改memcached,让memcached主动从数据库读取数据进行缓存
- Memcached缓存大数据时对服务器内存、CPU的影响及其对硬件的配置需求
- 分布式缓存系统Memcached(十)——状态机之网络数据读取与解析
- 清空memcached中缓存的数据的方法
- Tomcat集群下获取memcached缓存对象数量,统计在线用户数据量
- Memcached与MySQL数据同步