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