Memcached — 分布式缓存系统算法
1.Memcached是什么?数据库
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减小数据库负载,提高访问速度。Memcached经过在内存里维护一个统一 的巨大的hash表,它可以用来存储各类格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcached由Danga Interactive最初为了加速 LiveJournal网站访问速度而开发的,后来被不少大型的网站采用。起初做者编写它多是为了提升动态网页应用,为了减轻数据库检索的压力,来作的 这个缓存系统。它的缓存是一种分布式的,也就是能够容许不一样主机上的多个用户同时访问这个缓存系统,这种方法不只解决了共享内存只能是单机的弊端,同时也 解决了数据库检索的压力,最大的优势是提升了访问获取数据的速度!基于memcached做者对分布式cache的理解和解决方案。memcached完 全能够用到其余地方 好比分布式数据库,分布式计算等领域。Memcached将数据库负载大幅度下降,更好的分配资源,更快速访问。编程
2.Memcached工做机制api
经过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的。可是目前主要用来缓存数据库的数据。容许多个server经过 网络造成一个大的hash,用户没必要关心数据存放在哪,只调用相关接口就可。存放在内存的数据经过LRU算法进行淘汰出内存。同时能够经过删除和设置失效 时间来淘汰存放在内存的数据。缓存
如今一些.NET开发人员开始放弃ASP.NET内置的缓存机制,转而使用Memcached——一种分布式的内存缓存系统。当运行在单独的Web服务器 上,你能够很容易地清除一个已经确认被改变了的缓存。惋惜,ASP.NET没有一个很好的方法来支持多服务器。每一个服务器上的缓存都对其余缓存的改变一无 所知。服务器
ASP.NET容许经过基于文件系统和数据库表的触发器来做废一个缓存。然而,这也存在问题,好比数据库触发器须要使用昂贵的轮询,以及触发器自己冗长的编程。可是,咱们仍是有其余的选择的。网络
不像ASP.NET内置的缓存机制,Memcached是一个分布式的缓存系统。任何Web服务器都能更新或删除一个缓存项,而且全部其余的服务器都能在 下次访问这些缓存项的时候自动获取到更新的内容。这是经过把这些缓存项存储在一个或者多个缓存服务器上来实现的。每个缓存项都根据它的关键字的哈希值来 分配到一个服务器上。架构
表面看来,Memcached针对ASP.NET的API就像和内置的API同样。这让开发人员很容易地转换到Memcached上,仅仅经过在代码中查找和替换便可实现。分布式
一个被推荐的解决方案是不根据缓存项的关键字来生成哈希键值。这将容许开发人员可以让一个给定页面中须要的全部缓存项,尽可能存放在同一个服务器上。惋惜,基于数据保存的地方而不是基于缓存项自身的关键字来生成哈希键,很容易产生错误,须要仔细来实现(这个算法)。memcached
Memcached是基于Linux运行的,你能够在BSD的许可协议下使用Memcached。他也提供了针对C#的客户端以及Perl、Python、PHP、Java和其余语言的API:http://www.danga.com/memcached/apis.bml。还有一个Win32的移植版本(http://jehiah.cz/projects/memcached-win32/),可让Memcached运行在非Linux的机器上。
Cacheman — .NET架构下的分布式缓存项目
Cacheman听说是由微软旗下的 Popfly 项目组成员 Sriram Krishnan 的做品。是他用业余时间开发的。最新的状况是,微软的 Popfly 网站已经“悄悄地”的作了更新,就是采用了 Krishnan 的 Cacheman,更新了缓存机制。该项缓存技术更新带来的性能提高很是显著,根据Popfly团队中的 John Montgomery 的说法:加载一个已有的Mashup应用时,能够带来2到6倍的性能提高。
这些说法也获得了 Krishnan 本人的确认。他提到这是Cacheman 的第一次的实际应用,并自豪的说 Cacheman 不费吹灰之力就拿下了 Popfly 的所有访问量。
简单介绍一下 Cacheman 这个项目。主要参照 Krishnan的博客对Cacheman的介绍。
Cacheman是一个基于Windows平台的快速分布式哈希表。是由纯托管代码实现。中间搁置了有几个月,直到最近才开始从新上马这个项目,很可能就是由于Popfly项目须要的缘故才开始着手的。
Krishnan本人对 memcached 很感兴趣,因而建立了 Cacheman。Cacheman上有不少 memcached 的影子,好比与memcached类似的文本通信协议。Cacheman的通信协议公开,任何人能够根据本身偏心的语言环境写客户端。 Krishnan 在本身家用PC(2.4GHz Intel Core 2 带2GB内存)上进入测试,达到了每秒16000次左右的请求,而且仍是服务器与客户端都是在同一台服务器下完成的。
现这款产品还不太完善,做者自身也提到:在Cacheman作指定key的GET/SET/DELETE操做时,客户端须要弄清须要与哪一 台Cacheman服务器通信,为此要对该key作一个快速FNV哈希而后求余获得应该和几台服务器中的哪台服务器通信。但该法的缺点在于新增或删除一个 服务器节点时,缓存节点须要大规模迁移。修复该问题须要一致性的哈希算法,做者表示尚未时间解决此事。做者提出了采用中心架构的“主缓存服务器”的解决 办法,让客户端轮询主缓存服务器来获取应该与那个缓存服务器通信,但他也觉的这样作增长了复杂性,会带来些新问题。
能够感受到,因为 Cacheman 这个我的项目已经介入到 Popfly 这个正式产品中,可能很快就会被微软吸纳为正式产品,所以若是有人采用这个产品作本身缓存的解决方案的话,应该没必要太担忧后续的产品升级及文档支持服务, 它的将来前途值的期待。说不定 Krishnan 会从 Popfly 项目脱身出来专职负责这个 Cacheman 项目。
目前最新的版本是0.0.2版 :http://www.sriramkrishnan.com/code/。