教学之友,学习之友。

站长教学网

当前位置: 站长教学网 > 网站编程 > PHP教程 >

用Memcached缓存加速Mysql的查询解决并发压力

时间:2012-07-27 11:15来源:未知 作者:ken 点击:

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

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

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

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

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

view plainprint?//

$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服务器 站长教学网 eduyo.com

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

  

view plainprint?

$_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实现memcachemysql的缓存查询

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

  

view plainprint?

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;  

              

            //KeyValue写入MemCache  

            $_SGLOBAL['memcache']->set($key,$result,0,$MEMCACHE_LIFETIME);  

         

        return $value;  

      

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

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

 

附另外一个类似实用函数站长教学网 eduyo.com

<?php
$memcachehost = '192.168.1.1';
$memcacheport = 12000;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from user limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
        $conn=mysql_connect("localhost","root","passwd");
        mysql_select_db(users);
        $result=mysql_query($query);
        while ($row=mysql_fetch_assoc($result))
        {
            $arr[]=$row;
        }
        $f = 'db';
        $memcache->add($key,serialize($arr),0,30);
        $data = $arr ;
}
else{
        $f = 'mem';
    $data_mem=$memcache->get($key);
    $data = unserialize($data_mem);
}
echo $f;
echo "<br>";
//print_r($data);
foreach($data as $a)
{
        echo $a[user_id]._.$a[email];
        echo "<br>";
}
?>

(责任编辑:ken)
TAG标签: Memcached 缓存 并发
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
注册登录:不允许匿名留言,登录后留言无需输入验证码。
栏目列表
最新内容