memcached简介(转)

 背景

    memcached是一个高性能、分布式的内存对象缓存系统。
    memcached普遍应用在大负载高并发的网站上,是一种很是成熟的产品(称为一项技术也何尝不可)。像facebook,youtube,yahoo,sina,sohu,netease,豆瓣等网站均或多或少使用了该项产品。memcached在以用户为中心的网站上,表现尤为突出,例如sns,blog等web2.0应用的站点。这些站点通常来说,特别注重用户体验,用户对服务器的响应速度要求很高,用户数据相对比较复杂、关连度比较高,须要常常对数据库进行更新和检索。
    memcache是danga.com几个开源项目中的一个,最初是专门为livejournal.com站点而开发的,当时这个站点日pv达到了千万级,在使用过程当中出现了不少的与负载和响应速度相关的问题,因而开发了这个项目,旨在改善网站当时的困境。memcache能够应对任意多个链接,使用非阻塞的网络IO。它的使用很是简单和方便,最经常使用的功能不超过5个方法。
memcache官方网站: [url]http://www.danga.com/memcached[/url]
 

特色

    一、高性能
     不管哪种数据库dbms(mysql,oracle,mssql,db2,Postgres等等),再怎么优化,最终也避不开与慢速的存储介质(硬盘、磁带)进行数据交换,但每每一旦涉及到了存储介质的io操做,存取性能就会急剧降低。memcached,顾名思义,它的所有操做自始至终都是在内存中进行的,因此存取数据的效率很是高。
     固然,一般状况下,大型网站对于数据库的操做都会作优化。一般的手段有两种:
     a、读写数据分离,采用主/辅库的方式,来分散数据库的压力,提升查询速度。
     b、按照业务特色横向或者纵向分割数据库。简单来说,就是大库变小库,大表变小表,来提升数据库访问的效率。通常来说,一个数据库具备不少表或者一张表有N多的记录,都会明显的下降数据库的服务能力,好比mysql数据库单表记录达到2000万条左右(笔者之前的工做经验),性能会降低到几乎没法忍受。关于数据库的设计和优化,咱们之后能够单独作一个专题,这里不作太多的研究。
     数据库会在如下状况下会出现访问瓶颈:
     a、事务操做
     企业级的数据库(好比mysql的innodb模式)都支持事务操做。因为事务具备原子性,事务中涉及的数据表在运行过程当中将会加锁。在这种状况下,访问这些表的数据会出现延迟。
     b、数据更新
     数据库中任何的表在数据更新过程当中,一样会被加锁。在这种状况下,也会出现上面一样的结果。
     memcached的操做基本上就不会存在以上状况(实际上也有加锁的状况,在后面再详细探讨),因此它的性能很是高。官方网站上对它的正式评价是very fast。事实上也是如此,相关的实验室测试对比结果,你们能够到网上搜索一下,比比皆是。
 
    二、分布式
    所谓分布式系统比较专业的解释是:
    一种计算机硬件的配置方式和相应的功能配置方式。它是一种多处理器的计算机系统,各处理器经过互连网络构成统一的系统。系统采用分布式计算结构,即把原来系统内中央处理器处理的任务分散给相应的处理器,实现不一样功能的各个处理器相互协调,共享系统的外设与软件。这样就加快了系统的处理速度,简化了主机的逻辑结构。
memcache的分布式特性主要表如今两个方面:
a.memcache客户端mc和服务器端ms能够单独安装在任何独立server上。
  固然部署在同一台server上也没问题,甚至于一台机器上能够部署n个memcached。
b.memcache服务器端ms能够安装在任意数量的server上,提供并行存储和计算的能力。
  这是分布式特性的本质体现。ms能够造成任意多台server组成的集群,为mc提供服务。

用途

    一、提升系统的并发能力
    二、减轻数据库的负担
    这两种用途其实很是容易理解。因为memcached高性能,因此能够同时服务于更多的链接,大大提升了系统的并发处理的能力。另外,memcached一般部署在业务逻辑层(前台应用)和存储层(主指数据库)之间,做为数据库和前台应用的数据缓冲,所以能够快速的响应前端的请求,减小对数据库的访问。
    如下是一个memcached部署的逻辑示意图,其中mc是指memcached client,ms是指memcached server:
 
 
 

工做机制

    Memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的链接操做,客户端能够由各类语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端首先与 Memcached 服务创建链接,而后存取对象。每一个被存取的对象都有一个惟一的标识符 key,存取操做均经过这个 key 进行,保存的时候还能够设置有效期。保存在 Memcached 中的对象其实是放置在内存中的,而不是在硬盘上。Memcached 进程运行以后,会预申请一块较大的内存空间,本身进行管理,用完以后再申请一块,而不是每次须要的时候去向操做系统申请。Memcached将对象保存在一个巨大的Hash表中,它还使用NewHash算法来管理Hash表,从而得到进一步的性能提高。因此当分配给Memcached的内存足够大的时候, Memcached的时间消耗基本上只是网络Socket链接了。 
    Memcached按照LRU方式调度数据。LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。LRU算法在实际的工做环境中会与操做系统相关,好比32位的操做系统,最大的寻址空间是4G,若是当前内存的使用超过了这个限度,将被调出内存,内存中总维持最新最经常使用的数据。64位操做系统大大扩展了内存的寻址能力,因此如今很memcached服务都是运行在64位系统上。
 
相关文章
相关标签/搜索