• Memcached+PHP+Mysql+Linux 实践



    首先确保你的服务器环境已经具备了memcached和lamp,关于在Linux上搭建memcahced+php环境可以参考我的另外一篇帖子
    ( http://www.cnblogs.com/codeAB/p/5591118.html )
    在往下看之前你应该带着这几个问题。
    { memcached 能解决什么问题 }{ 现在比较热议的一个话题 radis替代memcached  }
    { 什么情况下适合使用memcached }{ memcached基本用法 }{ 利用memcached构建分布式缓存系统 }

    (1)举个例子,论坛里面的前面几条都是精华帖,访问量最大。一个帖子包括[帖子正文.评论.点赞.访问次数...],我们来模拟一下数据,一个帖子一天访问100万次,评论10万次,点赞50万次。如果所有操作都直接与mysql相连,那么至少要执行多少次数据库查询?
    (帖子100万次-读 ,评论10万次-写,点赞50万次-写),一篇帖子一天至少就要执行160万次数据库操作,现在我们使用memcached来缓解mysql压力,
    当第一个用户访问这个贴子后就将数据缓存到memcached中,缓存包括贴子正文,评论(通常只需要缓存最近的几十条评论),点赞次数,这样第二个人点击
    这篇帖子的时候,直接从memcached中获取数据返回,有新评论后将评论数据更新到memcached中,点赞也是直接更新memcached,甚至帖子内容被发布者修改后
    也可以直接修改memcached中的内容,都不用去动数据库,所有的更新和读取都在memcached中完成,也就是说从之前的一片帖子一天160万次数据库操作变成了一次!!只要你的服务器不断电,那么数据可以持续一个月,一个月一篇帖子从4800万次数据库操作 ---> 变成1次 。 当然这里得出的结论1次是不对的,由于memcached的最大缓存时间是30天,如果中途服务器断电,那么数据会全部丢失,所以在刚刚这个例子中,对于评论的增加和帖子内容的修改,这些变动最终还是要拿到数据库里面存好,所以我建议可以使用定时器( Linux contrab ) 每隔几分钟就把最新的memcahced数据同步到数据库,就算服务器断电了,也只丢失几分钟的数据,也是可以接受的,当然服务器无缘无故断电这种概率是非常微乎其微的。
    我想通过上面的例子对比你应该看出了memcached能解决什么问题了。主要用来缓解数据库压力。

    (2) 现在很多人议论或者已经在实践中用radis(泛指nosql)用来替换memcached了,这里我就不长篇大论去说二者的差异了,你可以搜索相关文章资料,
    捡几个重点说,memcached的目标就是做缓存,为了缓解数据库压力诞生的,而radis的目标是做一个数据库的替换方案,这货是建立在内存上的数据库,memcached断电后数据全部丢失(可以用定时器做持久化),radis是持久化的数据库,最重要的一点来了:memcached单一轻量,部署简单,多线程分布式的,radis比较吃配置,且是单线程的,看得出在做大型分布式缓存系统的时候memcached更方便安全,
    google和facebook这些大佬都在用memcached,而国内用radis的也比较多。最后我们在看一下第一点目标的差异,一个是缓解数据库压力的,一个是用来替代传统关系数据库的nosql,
    也就是说memcached和radis并不是竞争关系,甚至两者是可以协同工作的,radis做为数据库,memcached作为中间缓存系统,缓解radis负载量,最后我希望
    你也去学习一下nosql的相关知识,一种高性能内存数据库,我相信这是未来数据库发展的一个方向!

    (3)memcached本身用法都很简单,我相信你花10分钟看一遍官方文档就知道每个方法有什么作用了,但是看完过后是不是一脸茫然?
    在那些情况适合使用memcached?  首先不同的网站不同的场景下没有一个固定的规律,memcached的目标是什么? 缓解数据库压力。
    那么根据你自己的网站分析,找到访问量大数据变更少,我们去看看网易云音乐网站,看看那些地方memcached可以派上用场。


    打开首页看到中间部分是热门推荐如图1,这个地方的推荐大概几分钟至几十分钟都是不变的,访问量非常大,随便点击
    一个推荐进去看到如图2,

    包含了这个专辑创建的一些信息介绍,还有就是里面包含的歌曲列表信息,用户评论等,
    可以看到列表右上角当前播放次数是16万次,也就是16万次读数据库(还不包括评论和专辑的一些统计信息更新),利用memcached,在第一个用户请求了这个页面后就缓存进memcached中,
    以后的用户请求就直接走memcached了,利用memcached的让16万次读数据库降到1次!! ,
    评论和专辑的统计信息这里也可以走memcached,然后定时同步到数据库,大大降低数据库负载量。

    (4)用法很简单,随便举个例子,更多函数方法请查看php官方手册
       

        $m = new Memcached();
        $m->addServer('localhost', 11211);
        $m->flush();
        $m->add("key1","value1");
        class People {
            function __construct($name) {
                $this->name = $name;
            }
            function getname() {
                return $this->name;
            }
        }
        $p = new People("Tom");
        $s = serialize($p);
        $m->add("dd",$s);
        echo unserialize($m->get("dd"))->getname();
        echo "<br>".$m->get("key1");



    (5)

    $m = new Memcached();
        $servers = array(
            // 第三个参数是权重,数据会随机插入到一个memcached服务器中,权重越大被使用的概率越大
            array('192.168.150.130', 11211, 20),
            array('192.168.150.131', 11211, 30)
            array('192.168.150.133', 11211, 50)
        );
        // 三个主机之间通常在一个机房内,三个机子使用局域网连通,当然这不是必须的,原则上只要三台机子能互通就行
        $m->addServers($servers);
        $m->flush();
        $m->add("key1","value1");



        // 其他操作和上面的例子一样了

  • 相关阅读:
    excel的变量
    PHP安装pthreads多线程扩展教程[windows篇]
    识别字符串中的外链图片,下载存到本地,并替换图片地址
    mysql的binlog
    20165327《Java程序设计》实验一 Java开发环境的熟悉 实验报告
    20165327 2017-2018-2 《JAVA程序设计》第5周学习总结
    20165327 2017-2018-2 《Java程序设计》第4周学习总结
    20165327 第三周学习总结
    20165327 预备作业3 Linux安装及学习
    20155339 2016-2017-2 《Java程序设计》第3周学习总结
  • 原文地址:https://www.cnblogs.com/codeAB/p/5594812.html
Copyright © 2020-2023  润新知