Home >Backend Development >PHP Tutorial >memcached - 如何优雅的使用memcache和php配合呢?

memcached - 如何优雅的使用memcache和php配合呢?

WBOY
WBOYOriginal
2016-06-06 20:49:38912browse

最近在研究memcache和php配合小弟不知道该如何使用呢,是先要把整张表的数据全部查出来,缓存的内存上,然后再做类似sql的查询么?就是直接查内存而不是查表这样么?

求大牛给点例子哦

回复内容:

最近在研究memcache和php配合小弟不知道该如何使用呢,是先要把整张表的数据全部查出来,缓存的内存上,然后再做类似sql的查询么?就是直接查内存而不是查表这样么?

求大牛给点例子哦

memcache 是 key => value 的方式,一个key 对应 一个 value 。

memcache一般多用于存储大型能开销的数据,比如SQL结果集。将其序列化或者json_encode后存入memcache中,并命名为一个唯一的key值。下次则直接从memcached中获取该值。

注:经过测试serialize 后的string 存入memcached 比 json_encode后的string要快很多。 若直接将array存入memcached实际上memcached底层有将array进行 serialize(array); (我这里一直记错!!)

如下实例: 有数据table threads. 我们将其结果缓存起来。

<code class="lang-php">// 首先进行查询memcached中threads_list是否为非空集合
$list = json_decode($memcached->get("threads_list"));
if(!$list){
    $query = $db->query("SELECT * FROM `threads` ");
    while($value = $db->fetch_array($query)){
         $list[] = $value;
    }
    //进行memcached插入
    //$memcached->set(键值,内容,失效时间);
    $memcached->set("threads_list",json_encode($list),86400);
}

print_r($list);
</code>

以上操作将有效的减少mysql查询的开销。 当然memcached并非仅局限于sql的存储。具体还需要看业务上的需求。

不过强烈推荐redis!!!!!

原理:将你 SQL 查询的结果缓存在 memcache 里,下次执行同样的查询就直接从缓存中读取,而不用查询数据库,缓解数据库压力。

<code class="lang-php"><?php //实例化一个memcache对象
    $mem=new Memcache;

    //链接一台memcahe服务
    $mem->connect('localhost','11211');

    //准备SQL语句
    $sql='SELECT * FROM user';

    //设置一个键名
    $key=md5($sql);
    $data=$mem->get($key);

    //第二次之后的查询
    if(!$data){
        try{
            //链接mysql 
            $dsn="mysql:host=localhost;dbname=bbs";
            $pdo=new PDO($dsn,'root','root');
            //设置字符集
            $pdo->exec('set names utf8');

            $stmt=$pdo->prepare($sql);
            $stmt->execute();
            $data=$stmt->fetchAll();
            //把数据存储到memcache中(第一次查询)
            $mem->add($key,$data);
        }catch(PDOException $e){
            echo $e->getMessage();
        }
    }

    $mem->close();

    print_r($data);

?>
</code>

刚录好的视频,讲Memcache的
近距离探索memcache

同样的查询条件,可能能来不一样的结果,这样缓存更新问题如何解决?

先查和后查看你怎么写代码。 如果你准备把整个表或者库都写进Memcached的呢,那就的把整个业务流程都数据, 也就是说每次查询都是查询Memcached,相当于是把Memcached当数据库运用。 如果只是简单的操作,http://segmentfault.com/q/1010000000257857#a-1020000000257889 已经说了。 其实Memcached这种key、value的存储,看你key怎么生成了,如果单机使用的话,用条件来生成就可以了,集群的话就看你怎么分key了。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn