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");
// 其他操作和上面的例子一样了