分布式缓存系统Memcached的讨论

exzhulw 2010-05-20

楼主好像并不很了解memcached,我们公司已经用了好久,非常稳定,非常快,并发连接可以上到1w,我手头的应用常常保持在3-5k;它的快不仅是因为用了libevent,还因为它采取了“用内存冗余换存取速度”的内存管理策略,网上有文章专门分析它的内存分配回收管理的源码,讲的很清楚,在这上面jboss cache、ehcache、oscache跟它没法比;memcached的集群也非常好,听说国外有200+的memcached集群,我们也有这方面的尝试,效果也很好,一台down掉根本不会引起其他机器down掉,只是这台的数据丢了,需要慢慢积累回来;而且支持多客户端,java、php、python、ruby可以共享数据,就把它当作数据库用。我的建议是:你的应用访问量比较大,对响应速度要求很高,对数据一致性要求一般时,用它,挡在数据库前面,非常爽(memcached是互联网公司开发的,正好满足这三个条件);如果应用不忙,用用ehcache就行了。

to oldyoungj,ehcache、oscache 的数据都是在本机服务器上的,访问时走的仅是系统总线。而memcached走的是网络。俺不相信网络传输速度还会快过系统总线。

并不需要那么快。我们的应用读取memcached的网络流量是每秒有2MB的流量,是读取数据库的网络流量的大约5倍。但是你要知道现在随便的PC机都是千兆网卡,因此memcached的get/set操作的延时非常少,并不比echache的get/set慢多少。在一个完整的web应用当中,我的压力测试表明,性能差异 <= 5%

论坛、sns这样的应用,会使用多种技术进行缓存。

拿sohu的bbs来说吧,pv为5000w,峰值8000w

其中帖子、评论读写频繁,其他部分读频繁。

帖子列表、评论列表使用c开发(其中排序算法很巧妙),socket调用

帖子、评论内容使用squid缓存

其他读频繁的部分使用memcached、squid、定时生成静态页面等多种技术。

数据库用mysql,分表。

个人认为,小规模应用中,jvm级别的cache可以用用,memcached可用可不用

大规模网站应用,肯定是系统水平切分,多种cache结合。

memcached非常快,但我没说过比本机的ehcache还快,但用本地缓存有两点不爽:

1.缓存放在内存or放在磁盘?应用重启会导致内存缓存丢失,放在磁盘又不够快。内存开多大合适?如果是大访问量应用,缓存对象集中淘汰可能引起服务器load急剧波动(我们吃过亏,现在也开ehcache,但缓存对象的上限开的很小)

2.集群应用里缓存对象如何共享?jbosscache用的是广播,访问量大的时候,可以把你的服务拖死,这个我们也吃过亏

当然,有人谈到了sohu的例子,一旦访问量大了,各种缓存都得用着,目前我们就是squid+memcached+ehcache。squid也是好东西,但缓存内容删除不太灵活,比较适合web1.0,比如新浪搜狐的新闻

另外,java memcached client用1.6好了,没必要升级到2.1,2.X似乎还不太稳定。

相关推荐