使用Memcache缓存MySQL查询 .

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

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

 

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

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

 

     1、Memcache 服务器配置(内部集群模拟)缓存

   

  1. $MEMCACHE_SERVERS[] = '192.168.1.78:11211';  
  2.     $MEMCACHE_SERVERS[] = '192.168.1.78:11212';  
  3.     $MEMCACHE_SERVERS[] = '192.168.1.252:11211';  
  4.     $MEMCACHE_SERVERS[] = '192.168.1.252:11212';  
  5.     //若是要添加Memcache节点,就在此处添加便可。   
  6.       
  7.     $MEMCACHE_LIFETIME = 6000;   // 缓存数据生命周期  

服务器

 

    我采用了两台机器做为Memcache Server,每台开启两个端口提供Memcache服务,每一个服务开启服务内存为1G。这样,缓存空间总的有4G。并发

   2、php链接Memcache服务器ide

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

  

  1. $_SGLOBAL['memcache'] = new memcache;  
  2. global $MEMCACHE_SERVERS;  
  3. $result = array();  
  4. foreach ($MEMCACHE_SERVERS as $server){  
  5.         $serverstr = explode(':',$server);  
  6.     $host = $serverstr[0];  
  7.     $port = $serverstr[1];  
  8.          
  9.         $_SGLOBAL['memcache']->addServer($host,$port);  
  10. }   

测试

 

   这段程序从刚刚的memcache服务器配置文件中读取全部的server列表,并创立链接。

   3、php实现memcache和mysql的缓存查询

   实现原理其实很简单,在个人数据库操做类中新增一个函数query_memcache($sql,$type),以$sql的MD5值做为Key,从 Memcache服务器上查询是否存在该key的值,若是存在,则直接返回;若是不存在,则从MySQL数据库中查询,并将结果写入Memcache。

  

  1. function query_memcache($sql,$type=''){  
  2.         $key = md5($sql);  
  3.           
  4.         if(!($value = $_SGLOBAL['memcache']->get($key))){ //Cache中没有,则从My SQL中查询   
  5.             $query = $this->query($sql,$type);  
  6.             while($item = $this->fetch_array($query)){  
  7.                 $result[] = $item;  
  8.             }  
  9.             $value = $result;  
  10.               
  11.             //将Key和Value写入MemCache   
  12.             $_SGLOBAL['memcache']->set($key,$result,0,$MEMCACHE_LIFETIME);  
  13.         }  
  14.         return $value;  
  15.     }  

 

 

   在页面加载的过程当中,将图片检索的数据库查询调用改为用query_memcache()函数便可。

 

   到此,咱们就实现了用Memcache缓存首页数据信息,经测试,在大规模的并发访问下,首页加载速度快了许多。

 

   用计时器测试单台客户端访问响应时间以下:

 

  

  (红线框内的是第一次从数据库中读取数据的耗时,当数据存入Memcache后,读取数据耗时更短【蓝线框的数据】)