Chinaunix首页 | 论坛 | 博客
  • 博客访问: 210490
  • 博文数量: 45
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 444
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-11 12:23
文章分类

全部博文(45)

文章存档

2017年(1)

2016年(14)

2014年(30)

我的朋友

分类: Web开发

2014-03-12 14:21:10

使用Memcache缓存MySQL查询  

实际应用中,尤其是在大规模访问的Web项目中,Memcache作为一种优秀的缓存解决方案,被广泛使用。其灵活性和可扩展性受到了广大开发者的青睐。为了提高响应速度,使用Memcache来减少数据查询运算是一种不错的选择。

      关于Memcache的安装和配置,网上有很多资料,这里就不再赘述。本文以笔者在实际项目中的应用为例,来说明如何使用Memcache缓存MySQL数据,从而达到高效数据响应的目的。

 

      需求背景:网站有一个图片放映功能,页面加载时需从数据库中查询管理员所提交放映的图片信息,图片放映区共有9张图片,对应在数据库表中有9条记录。每次用户访问网站时,需查询数据库,并显示图片。当承受大规模用户同时访问时,数据库的压力可想而之。

       为了降低数据库压力,提高查询速度,我采用了Memcache来将图片记录信息缓存到Memcache服务器上。这样就将数据库的查询压力分散到了各缓存服务器,提高了网站访问的整体效率。

 

     一、Memcache 服务器配置(内部集群模拟)

 $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,每台开启两个端口提供Memcache服务,每个服务开启服务内存为1G。这样,缓存空间总的有4G。

   二、php连接Memcache服务器

   php中和Memcache的交互有两种:1、采用php下的memcache扩展;2、采用libmemcache组件。两者的优劣在此先不作对比。

$_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。

 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()函数即可。


阅读(1600) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~