写这篇文章之前,我也特意跟以前的同事做了一些交流,在此感谢sina xiangdong、kingsoft zhangyan和yahoo luke。另外,还有网上的朋友对我上一 节的文章发表了许多有建设性评论,在这里一并感谢。
memcached最吸引人的地方主要在于它的分布式。分布式对于互联网应用来讲 ,按照用途基本上可划分为三种方式:分布式计算、分布式存储和两者兼而有之 。memcached是分布式存储的一种。我们常见的分布式存储大多数是将N台设备( server或者单独的存储)构建成盘阵,而memcached旨在构建一个高速的内存池 。更通俗一点来讲:分布式计算是将N颗cpu组装成一颗cpu,分布式慢速存储是 将N个硬盘组装成一个大硬盘,memcached是将N块内存组装成一块大内存。
有个朋友问:那是不是代价很昂贵啊。我的回答是肯定的。如果你的网站规 模只有三两台服务器的话,我觉得你就不用考虑这样的方案了,等你的网站做大 了以后,再参考这方面的资料即可。一般都是比较大的互联网公司为了追求更好 的用户体验,才进行这方面的投资,对他们来讲,用户体验至上,money是小 case。
还有朋友问:有一些dbms提供内存表的功能,比如mysql的内存表,可以代替 memcached。但我要建议你的是:mysql的内存表确实起到同样的作用,但它的局 限也很多,往往不能让你随心所欲,所以建议你不要走弯路。
二、memcached的应用场景
2.1 应用范围
memcached产品或相关技术的应用,我们在前面已经提到了一些。其实它的应 用还是非常普遍的,应用作为广泛的领域:例如sns类网站、blog类网站、bbs类 网站以及im后台服务。
2.2 sns类网站的应用
livejournal.com是99年始于校园中的项目,有点像中国的校内网。几个学生 纯属出于爱好做了这样一个网站,主要实现以下功能: sns、blog、bbs和rss等 。livejournal从建立开始就采用了大量的开源软件,到现在它本身也衍生了不 少开源软件。 sns网站,现在比比皆是,规模比较大的象开心、校内、51,它们 的页面上往往需要引用大量的用户信息、好友信息以及文章信息等,所以跨表或 跨库操作会相当多。如果这些功能全部直接操作数据库,显然会带来极大的效率 损耗和系统负载。memcached在这样的场景下就会发挥巨大的作用,它采用大内 存把这些不变的数据全都缓存起来,当数据修改时就通知cache过期,这样应用 层基本上就可以解决大部分问题了,只有很小一部分请求穿透应用层,用到数据 库。
2.3 blog、bbs类网站的应用
象blog.sina.com.cn这些流量巨大的blog系统,它需要频繁读写的一些小数 据。其中最典型的应用,我们通常成为“数字类服务”,比如blog中 需要实时显示的用户点击数和阅读数,bbs中需要记录的在线人数、在线用户等 。这些小数据的处理非常繁琐,你无论怎么去设计数据库,都很难避开跨表或者 跨库。有的朋友会说,可以在数据库中增加冗余字段解决这类问题,但事实上, 这既不符合数据库设计的范式规则,也很难做到数据的一致性,由此会引发更为 复杂的问题。而且由于产品线的分散发展,数据已经很难做到完全的统一规划。 memcached在这样的场景下就会将这些小数据进行缓存,定期持久化就可以了, 查询操作一直都在内存中运行。说到这里,有的朋友又会想到一些其它的问题: “memcached server宕机了怎么办,怎么保证与数据库的数据一致” 。我会对你说:“你的问题非常好,我们将会在后面章节给出相应的解决 方案”。另外,其实这种小数据并不是关键性数据,即使偶尔发生点错误 ,也没太大的问题。blog、bbs系统并不是严格的企业级系统,假如你是为银行 业务提供解决方案的话,memcached并不适合。
2.4 im server的应用
前些时间, 有一些文章介绍memcached 在Jabber上应用。写累了,喝口水, 读者自己去找找资料吧,有时间的话,帮我补上吧,呵呵。
我们举了几个例子来说明memcached的应用场景,似乎都局限于小数据服务, 那是不是就不能用于较大数据的缓冲了?那绝不是,memcached能够用来存储各 种格式的数据,包括图像、视频、文件以及数据库检索的结果等等,而且生产环 境中就这么跑过,只不过让大数据量使用缓冲的话,有点太浪费了,同样数量的 内存存不了几条数据,所以会明显的降低命中率。