使用Memcache缓存MySQL查询 .
2013-02-02 22:09
639 查看
实际应用中,尤其是在大规模访问的Web项目中,Memcache作为一种优秀的缓存解决方案,被广泛使用。其灵活性和可扩展性受到了广大开发者的青睐。为了提高响应速度,使用Memcache来减少数据查询运算是一种不错的选择。
关于Memcache的安装和配置,网上有很多资料,这里就不再赘述。本文以笔者在实际项目中的应用为例,来说明如何使用Memcache缓存MySQL数据,从而达到高效数据响应的目的。
需求背景:网站有一个图片放映功能,页面加载时需从数据库中查询管理员所提交放映的图片信息,图片放映区共有9张图片,对应在数据库表中有9条记录。每次用户访问网站时,需查询数据库,并显示图片。当承受大规模用户同时访问时,数据库的压力可想而之。
为了降低数据库压力,提高查询速度,我采用了Memcache来将图片记录信息缓存到Memcache服务器上。这样就将数据库的查询压力分散到了各缓存服务器,提高了网站访问的整体效率。
一、Memcache 服务器配置(内部集群模拟)
[php] view plaincopyprint?
$MEMCACHE_SERVERS[] = '192.168.1.78:11211';
$MEMCACHE_SERVERS[] = '192.168.1.78:11212';
$MEMCACHE_SERVERS[] = '192.168.1.252:11211';
$MEMCACHE_SERVERS[] = '192.168.1.252:11212';
//如果要添加Memcache节点,就在此处添加即可。
$MEMCACHE_LIFETIME = 6000; // 缓存数据生命周期
这段程序从刚刚的memcache服务器配置文件中读取所有的server列表,并创立连接。
三、php实现memcache和mysql的缓存查询
实现原理其实很简单,在我的数据库操作类中新增一个函数query_memcache($sql,$type),以$sql的MD5值作为Key,从 Memcache服务器上查询是否存在该key的值,如果存在,则直接返回;如果不存在,则从MySQL数据库中查询,并将结果写入Memcache。
[php] view plaincopyprint?
function query_memcache($sql,$type=''){
$key = md5($sql);
if(!($value = $_SGLOBAL['memcache']->get($key))){ //Cache中没有,则从My SQL中查询
$query = $this->query($sql,$type);
while($item = $this->fetch_array($query)){
$result[] = $item;
}
$value = $result;
//将Key和Value写入MemCache
$_SGLOBAL['memcache']->set($key,$result,0,$MEMCACHE_LIFETIME);
}
return $value;
}
function query_memcache($sql,$type=''){
$key = md5($sql);
if(!($value = $_SGLOBAL['memcache']->get($key))){ //Cache中没有,则从My SQL中查询
$query = $this->query($sql,$type);
while($item = $this->fetch_array($query)){
$result[] = $item;
}
$value = $result;
//将Key和Value写入MemCache
$_SGLOBAL['memcache']->set($key,$result,0,$MEMCACHE_LIFETIME);
}
return $value;
}
在页面加载的过程中,将图片检索的数据库查询调用改成用query_memcache()函数即可。
到此,我们就实现了用Memcache缓存首页数据信息,经测试,在大规模的并发访问下,首页加载速度快了许多。
用计时器测试单台客户端访问响应时间如下:
(红线框内的是第一次从数据库中读取数据的耗时,当数据存入Memcache后,读取数据耗时更短【蓝线框的数据】)
关于Memcache的安装和配置,网上有很多资料,这里就不再赘述。本文以笔者在实际项目中的应用为例,来说明如何使用Memcache缓存MySQL数据,从而达到高效数据响应的目的。
需求背景:网站有一个图片放映功能,页面加载时需从数据库中查询管理员所提交放映的图片信息,图片放映区共有9张图片,对应在数据库表中有9条记录。每次用户访问网站时,需查询数据库,并显示图片。当承受大规模用户同时访问时,数据库的压力可想而之。
为了降低数据库压力,提高查询速度,我采用了Memcache来将图片记录信息缓存到Memcache服务器上。这样就将数据库的查询压力分散到了各缓存服务器,提高了网站访问的整体效率。
一、Memcache 服务器配置(内部集群模拟)
[php] view plaincopyprint?
$MEMCACHE_SERVERS[] = '192.168.1.78:11211';
$MEMCACHE_SERVERS[] = '192.168.1.78:11212';
$MEMCACHE_SERVERS[] = '192.168.1.252:11211';
$MEMCACHE_SERVERS[] = '192.168.1.252:11212';
//如果要添加Memcache节点,就在此处添加即可。
$MEMCACHE_LIFETIME = 6000; // 缓存数据生命周期
[php] view plaincopyprint? $_SGLOBAL['memcache'] = new memcache; global $MEMCACHE_SERVERS; $result = array(); foreach ($MEMCACHE_SERVERS as $server){ $serverstr = explode(':',$server); $host = $serverstr[0]; $port = $serverstr[1]; $_SGLOBAL['memcache']->addServer($host,$port); } $_SGLOBAL['memcache'] = new memcache; global $MEMCACHE_SERVERS; $result = array(); foreach ($MEMCACHE_SERVERS as $server){ $serverstr = explode(':',$server); $host = $serverstr[0]; $port = $serverstr[1]; $_SGLOBAL['memcache']->addServer($host,$port); }
这段程序从刚刚的memcache服务器配置文件中读取所有的server列表,并创立连接。
三、php实现memcache和mysql的缓存查询
实现原理其实很简单,在我的数据库操作类中新增一个函数query_memcache($sql,$type),以$sql的MD5值作为Key,从 Memcache服务器上查询是否存在该key的值,如果存在,则直接返回;如果不存在,则从MySQL数据库中查询,并将结果写入Memcache。
[php] view plaincopyprint?
function query_memcache($sql,$type=''){
$key = md5($sql);
if(!($value = $_SGLOBAL['memcache']->get($key))){ //Cache中没有,则从My SQL中查询
$query = $this->query($sql,$type);
while($item = $this->fetch_array($query)){
$result[] = $item;
}
$value = $result;
//将Key和Value写入MemCache
$_SGLOBAL['memcache']->set($key,$result,0,$MEMCACHE_LIFETIME);
}
return $value;
}
function query_memcache($sql,$type=''){
$key = md5($sql);
if(!($value = $_SGLOBAL['memcache']->get($key))){ //Cache中没有,则从My SQL中查询
$query = $this->query($sql,$type);
while($item = $this->fetch_array($query)){
$result[] = $item;
}
$value = $result;
//将Key和Value写入MemCache
$_SGLOBAL['memcache']->set($key,$result,0,$MEMCACHE_LIFETIME);
}
return $value;
}
在页面加载的过程中,将图片检索的数据库查询调用改成用query_memcache()函数即可。
到此,我们就实现了用Memcache缓存首页数据信息,经测试,在大规模的并发访问下,首页加载速度快了许多。
用计时器测试单台客户端访问响应时间如下:
(红线框内的是第一次从数据库中读取数据的耗时,当数据存入Memcache后,读取数据耗时更短【蓝线框的数据】)
相关文章推荐
- 使用Memcache缓存MySQL查询
- 使用Memcache缓存MySQL查询
- 使用Memcache缓存MySQL查询
- 用Memcache缓存加速Mysql的查询
- [MySQL优化案例]系列 -- 无法使用查询缓存
- 【转】mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
- Mysql中使用的查询缓存
- MySQL的高速查询缓存强制要求使用高速缓存
- MySQL缓存的查询和清除命令使用详解
- [MySQL优化案例]系列 -- 无法使用查询缓存
- MySQL缓存的查询和清除命令使用详解
- 分析mysql的QueryCache在相同语义SQL是否可以使用查询缓存
- RDS for MySQL查询缓存 (Query Cache) 的设置和使用
- MySQL查询缓存的内存使用和碎片管理
- MySQL缓存的查询和清除命令使用详解
- 【MySQL】使用查询缓存
- MYSQL查询缓存的使用
- 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析
- MySQL配置内存使用之线程缓存和表缓存
- MySQL 查询缓存测试