Twitter大量使用Memcached,MQ也是基于Memcached 协议的,Memcached并不是新鲜的东西,但是由于它强大的影响力,有必要深入一下,这篇主要讲它的基础:
1.Memcached是什么?
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据 库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目); 当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。
一般MemCached架构在数据库层之前,应用程序先访问MemCached Server,并从里面拿数据,如果拿不到,再访问数据库,以减低数据库的负载。在Web应用中,IO始终是个瓶颈,尤其是数据库这层,数据库在数据量不大时,没有显现明显的性能问题,但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。
2.谁在用MemCached?
大量的Web2.0的网站架构都使用了MemCached,Web2.0的用户增长速度,使得数据量急剧增加,数据库已经承受不了这么大的压 力,MemCached几乎成为了大网站架构的标配。
LiveJournal
Wikipedia
Flickr
Bebo
Twitter
Typepad
Yellowbot
Youtube
Digg
Wordpress
Craigslist
Mixi
3.Memcached的应用场合
在很多时候,memcached都被滥用了,这当然少不了对它的抱怨。我经常在论坛上看见有人发贴,类似于"如何提高效率",回复是"用memcached",至于怎么用,用在哪里,用来干什么一句没有。memcached不是万能的,它也不是适用在所有场合。Memcached是"分布式"的内存对象缓存系统,那么就是说,那些不需要"分布"的,不需要共享的,或者干脆规模小到只有一台服务器的应用, memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用memcached是非常不划算的。Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。另外,memcached也经常作为服务器之间数据共享的存储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中,被多个应用共享。
需要注意的是,memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所以 memcached不能用来持久保存数据。很多人的错误理解,memcached的性能非常好,好到了内存和硬盘的对比程度,其实memcached使用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络连接,它和使用磁盘的数据库系统相比,好处在于它本身非常"轻",因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。
4. Memcached的重要特征
1)基于C/S结构,协议简单
例如
存储命令:"set", "add", "replace", "append","prepend" and "cas"
获取命令:get和gets
2)基于libevent的网络并发连接事件处理,使得在高并发情况下,依然保持了非常高的响应能力
3)优化的内存存储管理
4)基于客户端的MemCached的分布式
MemCached是分布式的,但是对Cache而言是集中式的,它通过client端的处理,让key对应的Hash值相同,cache数据存放在同一个server上:
例如: