【翻译】Memcached Wiki(2) —— 缓存的故事
原文地址:http://code.google.com/p/memcached/wiki/TutorialCachingStory
缓存的故事
两个勇敢的冒险者,程序员(programmer)和系统管理员(sysadmin),开始了一段旅行。他们一起制作网站,网站包含web服务器和数据库。用户们通过互联网访问站点,与web服务器对话,要求为他们返回页面。web服务器则向数据库发请求来生成那些页面。程序员编码,系统管理员增加web服务器和数据库服务器。
一天系统管理员认识到他们的数据库病了,因为它总是喷出红色的@#¥%!系统管理员断言一定是发烧了,平均负载量为20!程序员问道:“那么,我们能做什么?”系统管理员说:“我听说过一个伟大的东西叫做memcached,它曾经帮助过livejournal,youtube,twitter等许多站点”。
“好吧让我们试试”程序员道。
勇敢的系统管理员注视着他的6个web服务器。他决定用其中的3个来运行memcached server。系统管理员为每个web服务器增加了1G内存,然后启动了memcached,并限制其内存使用为1G。这样他拥有了3个memcached实例,每个都能容纳1G的数据。最后,程序员和系统管理员静静等待着充满光辉的memcached。
“呃,什麽情况”他们说,“它竟然啥都没做!”。memcached没有任何交互,当然也没有任何的数据,而现在他们的数据库平均负载到了25!
爱冒险的程序员抓住了pecl/memcache client libray手册,也就是安装在6台web服务器上的那些。“别怕!”他说,“我有办法了!”。他把3个memcached server的ip与端口记录在了一个php的数组里
-
$MEMCACHE_SERVER = array( "10.1.1.1", // web1 "10.1.1.2", // web2 "10.1.1.3", // web3 );
然后他生成了一个对象,名字叫”$memcache”
-
$memcache = new Memcache(); foreach($MEMCACHE_SERVERS as $server){ $memcache->addServer ( $server ); }
然后程序员开始思考,想啊想啊想。
“我知道了!”他叫道“前台有个东西执行了SELECT * FROM hugetable WHERE timestamp > lastweek ORDER BY timestamp ASC LIMIT 50000; 这玩意运行了整整5秒!”
“让我们把它放到memcached里”。他把SELECT的代码打进了那个$memcache对象中。他的内码做了如下工作:
SELECT语句的结果是否存在于memcache中,如果不存在的话,那么就执行查询,把结果放入memcache,代码如下
-
$huge_data_for_frong_page = $memcache->get("huge_data_for_frong_page"); if($huge_data_for_frong_page === false){ $huge_data_for_frong_page = array(); $sql = "SELECT * FROM hugetable WHERE timestamp > lastweek ORDER BY timestamp ASC LIMIT 50000"; $res = mysql_query($sql, $mysql_connection); while($rec = mysql_fetch_assoc($res)){ $huge_data_for_frong_page[] = $rec; } // cache for 10 minutes $memcache->set("huge_data_for_frong_page", $huge_data_for_frong_page, 600); } // use $huge_data_for_frong_page how you please
程序员更新了代码。系统管理员开始冒汗。。。
。。。
啪!!
数据库负载下降到了10!网站现在快多了。但是系统管理员突然迷惑起来:“到底发生了什么?”“我在memcached servers上安装了图表软件(cacti),但是只看到其中一个memcached有交互!我可是安装了三个memcached server的!”。然后管理员迅速学习了ascii协议并telnet到了每个memcached的11211端口,他问道:
Hey, ‘get huge_data_for_front_page’ 你在吗?
第一个memcached没有回答。。。
第二个memcached也没用回答。。。
第三个memcached,呃。。在telnet session中吐出了一大坨的东西!。。。数据在这!只有一个memcached存储了程序员取出的缓存!
不解,随即他向邮件列表(mailing list)求助。所有的回复都是一个说法“这是一个分布式的缓存,就是那样工作的”。不过。。。那是到底是啥意思。。。仍然很迷惑。。。甚至有一点害怕。系统管理员让程序员再稍微多缓存一些东西,“让我们看看会发生什么,我们一定能把这玩意解决”。
“好吧,还有另外的一个查询,它并不慢,但是每秒会执行100次。或许memcached能帮忙。”程序员道。然后他就想之前做的一样更新了代码。这一次,数据库负载降到了8!
之后程序员就把越来越多的东西缓存了起来,他使用了新的技术。“我从list和faq里面找到了这些东西,多好的家伙们”他说。数据库的负载越来越小7,5,3,2,1!
“ok”系统管理员说“我们再试试”他又看了看图表软件。所有的memcache都在运行,而且都接到了requests。这非常好,它们都工作了。
又一次的,他在memcache servers上寻找用程序员使用过的key。get this_key’ ‘get that_key’ 但是每个key,他都只能从唯一的一个memcached中找到!为什么会这样呢,他彻夜思索,不得其解。那太傻了,难道你不想让keys存在于所有的memcacheds上么?
“等等”他想了想“我给了每个memcached 1G的内存,也就是说,我总共能缓存3G数据库的数据,而不是1G,啊,这太好了!”“这可以让我减少1吨的垃圾,#@#¥#¥%……”
“不过,嗯,还有个问题,这是个棘手的事。有个web服务器在这儿,运行着memcached,但是它很老了且有问题,需要升级。可如果升级我需要把它offline!offline的话,那我的memcache cluster咋办?呃。。。试试看好了”。他关闭了web服务器。然后他盯着图表软件”噢,数据库负载在直线上升!负载不再是1了,现在变成了2。嗯。。不过还可以忍受。所有其他的memcached都还在工作,这还不算太坏。仅仅是有一些缓存miss了,我也即将完成我的工作了。然后他打开了web服务器,并让memcached重新开发工作。几分钟后,数据库负载重新变回了1
“缓存自己恢复了!我明白了,如果它不可用了仅仅意味着我的一些请求miss了。但是还那不足以kill me。很好,很强大。”
之后,程序员和系统管理员不断创建着网站。他们继续使用着缓存。有问题的时候,询问mailing list或是读读faq。不时看看他们的图表软件。俩人从此以后的生活一直很happy。
【翻译】Memcached Wiki(1) —— 概述
原文地址:http://code.google.com/p/memcached/wiki/NewOverview
Memcached
Memcached是一个免费,开源,高性能,分布式内存对象缓存系统,具有通用性。特别适用于减轻数据库负载从而加速动态web应用。
Memcached将key-value以小数据块的形式存储在内存中的,其中的内容可能是数据库调用的结果,api调用的结果或是页面渲染。
Memcached简单且强大。它能够加快开发速度,减轻开发压力并能解决面对大型数据缓存的许多问题。它提供多种语言的API。
它的核心是最简单的key-value(键-值)存储。
更多关于Memcached
我把它打开了但是我的应用没有变快!!
Memcached是一个开发工具,不是一个代码加速器,更不是一个数据库中间件。如果你尝试对下载或购买的应用程序去使用memcached,你最好期望能在它们的官方文档里看到怎样使用memcached。不过大部分情况下那些文档帮不了你太多。
Memcached的组件有哪些?
·客户端,它能得到当前可用memcached server列表
·客户端的哈希算法,它能依据输入的key选择一个server
·服务器端,它在自己内部的哈希表中存储key-value数据
·服务器端算法,它会决定何时丢掉旧数据(如果内存不足的话),或是重用内存
Memcached的设计理念
简单的key/value存储结构
服务端不关心你的数据是什么。数据项由一个key,一个expiration time(到期时间),一些可选标志和原始数据组成。它不关心数据结构是什么,你必须上传pre-serialized(预串行化?)过的数据。一些命令(incr/decr)可以操作底层数据,但它们的实现都很简单。
灵巧的实现(一半在客户端,一半在服务器端)
一个”memcached implementation”是一部分在客户端实现,一部分在服务器端实现的。
客户端知道应该怎样发送数据项给特定的服务端,知道当服务端无法通信时改怎样做,也知道怎样从服务端获取key
服务端知道怎样接收数据项并且怎样让数据项过期。
服务器端相互无联系
Memcached服务端通常无法察觉其它服务端的存在,也就是说,它们之前没有通信,没有同步,没有广播。缺乏内部连接意味着,当你添加更多的服务端的时候将会增加比你预想的更多的容量。这个原则或许有例外,但那些是少数情况并且应该特别注意。
一切都是O(1)复杂度
所有memcached的命令都是O(1)的复杂度。每个命令每次处理都大致花费相同的时间,并且不会再任何地方出现明显的缓慢。这源于“简单的key/value存储结构”法则,就如同你并不想同时在缓存服务中处理成百上千个webserver的请求。
忘记数据是一个Feature
Memcached默认是一个Recently Used cache(最近使用过的缓存)。它被设计成当经过特定的时间段后让数据项过期。这两点对许多问题都是比较优雅的解决方法。过期数据项在一分钟后限制旧数据的返回,或是flush未使用的数据来保留频繁的请求信息。
这些使得memcached运行中保持极大的简单化。无等待的垃圾回收器保证了低延时,且空闲空间被非主动的回收了。
缓存失效是一个问题
由于memcached的中央集群的概念,将缓存条目标记为失效的工作变得很琐碎。相比对所有可用的host广播数据,客户端直接处于需要验证的数据位置上。可能在你的需求上有更加复杂的情况,也就是那些注意事项,但是你已经sit on a strong baseline
Memcached的演变
(略)
关于用winpe装xp系统
ubuntu10.04下使用eva
用了webqq,linuxqq,empathy,pidgin,选来选去还是eva最好用(群,最近联系人,签名,传文件,发图片都没问题)。
wget ftp://www.bjlx.org.cn/eva/eva_0.4.921bugfix58_etch_i386.deb
sudo apt-get install kdelibs4c2a
sudo apt-get install kdelibs
sudo dpkg -i eva_0.4.921bugfix58_etch_i386.deb
就是托盘图标有点丑
说说星盘
星盘的确是个奇妙的东西。我并不是宿命主义者,也不认同一张本命盘就决定了某人一生命运的说法。不过很多时候,它的确能够给你一些东西。
多数人都会认为那就是心理暗示而已,加上解盘人模棱两可的话,当事人被忽悠也很正常。但如果你问他们相信与否,大部分会回答“不知道”或是“不相信”。这看起来是件荒谬的事情,其实对于他们而言,真正想要的,仅仅是一个答案,一种说法。至于之后造成的是心理上的慰藉还是对错误的反思,那就靠当事人的造化了。心理学上说人都有自我认知,但每个人都有自我认知的盲区。我觉得星盘最大的意义在于能让自己发现这些盲区,甚至是深藏的自我。当你把它与自身的某些行为与思维模式的缺陷联系到一起时,就会明白这种看似无所根据的东西为什么存在了两千多年。
星座与星体为何被赋予如今的意义,我不得而知。或许那是古人的智慧与经验,也或许那仅仅是唬人的玩意。星盘对于每个人都有着不同的意义,许多人对它嗤之以鼻,认为这种“玄之又玄”的东西是迷信;也有不少人对它崇拜至极,认为星盘所表示的全都是真理,凡事必求之。信也好,不信也好,其实星盘只是自我认知的一种手段,所以不要太在意什么“对冲”与“落陷”之类,如果在解盘的过程中能学到些什么,明白些什么,或许那才是它真正的价值所在吧。
路
绝大多数年轻人都在想一个问题:我将来要做什么,成为谁。
这其中有的人可以自然而然的上路,因为不论你情愿与否,路已铺好,也似乎只有一条路。有的人左右不能逢源,不停地寻求改变。而有的人,迟迟不愿长大,不愿成为社会人,不愿踏上某一条路。怕的只是一条路有多少岔口,走啊走就不能再回头,回过神来时,青春和梦想荡然无存了。 我想我就属于这种人。上学时什么都想做,拍学生DV,写剧本,演舞台剧,写小说。但是什么也没做成,从未获得过朋友亲人之外的肯定,都半途而废了。最后只收获了零零散散的回忆。里面有甜有苦,更有酸。张爱玲写过,“对于三十岁之后的人来说,十年八年不过是指缝间的事,而对于年轻人而言,三年五年就可以是一生一世”。二十岁左右的这几年做过什么,遇到过谁,都是一辈子的事,岂能随意。
然而在国外的日子,最低谷的时候一边准备论文啊研究啊什么的,一边还要打工做体力活。每次从打工的超市下班的时候,我会悄悄地从超市内部的垃圾箱里“偷”一些因为快过期而被扔掉的食物。原因很简单,我没钱。也只是在那个时候我突然明白了:活着就是为了活着,理想或梦想都是存在心里的,不必挂在嘴边,脚踏实地的做好眼前工作才是属于自己的路。之前好高骛远,犹豫不决的自己实在太可笑了。 这个世界的年轻人都会面对一个个十字路口,记得大学毕业的最后一天,我提着行李离开寝室的时候,想兄弟们挥了手,一声再见一如平常。但心里明白,有的时候有的人,此刻说了再见,却一辈子也不会再见了。大家各奔东西,有的人上研出了国,有人留在本地工作有人去了外地发展,有人背上空空的行囊回家了。我总觉得,凡是绝大多数人选择的路,其中必然包含了绝对的正确,同时也包含了绝对的错误。比如考研,出国,不停换工作,都是如此。人活着,活出自己的路地方法,似乎只有竭尽全力做好眼下能做好的事,活在当下。富二代们活在云中的时候,百姓们的孩子还在咬紧现实,牙根和脑袋都变得麻木:并无几分资本的女孩们看着“非诚勿扰”单方面地抬高身价的时候,请留意一下餐厅,街边做小生意的外地姑娘在做着辛苦实在的工作。有人几乎24小时对着电脑,论坛,肥皂剧,淘宝。空间,偷菜,XX,动画,网游,QQ,在网上说起话来只会喷,别人的东西都是垃圾。有的人走上社会才明白自己真的什么也不会,只能低下头,风吹日晒甚至在街边发传单替客户买早点,就这样从零一步步走向未来的自己。这些都是年轻人的路,也许不公,也许不平,但是确实是我们脚下的路,用力一踏震得生疼的路。我们不能总是遥望着太远的地方,更不必妄自菲薄相信自己永远直不起脊梁。人想走上哪条路,命运是挡不住的,何况是某个人,某件事,某些话。所以同样是年轻的朋友们,没有必要被励志书和“过来人”的豪言壮语激励得兴奋难眠,因为“顿悟”若不置于“渐悟”之中,往后难免会生出“顿迷”来。更不必被“所谓的现实”和那些“没过来”的人拉拢为臣服生活的泛泛之辈。因为你如果问乔丹你能否灌篮,乔丹不会告诉你不能,而去问那些本身不能灌篮的人,他们才会告诉你“太难,你不能”。勇敢坚持的踩稳自己的路,才能通向自己的梦。


