memcached是一个高性能的分布式的内存对象缓存系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方比如分布式数据库,分布式计算等领域。
1、memcached 协议理解
memcache是为了加快/访问速度而诞生的一个项目。
它的官方主页是:/memcached/
目前在网站开发中应用较少,主要的应用有:
/memcached/users.bml
在国内的网站开发中,还很少没见到有应用的,中文资料十分匮乏。
工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU 算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。
2、memcached 使用入门
memcached最吸引人的地方主要在于它的分布式。分布式对于互联网应用来讲,按照用途基本上可划分为三种方式:分布式计算、分布式存储和两者兼而有之。memcached是分布式存储的一种。我们常见的分布式存储大多数是将N台设备(server或者单独的存储)构建成盘阵,而memcached旨在构建一个高速的内存池。更通俗一点来讲:分布式计算是将N颗cpu组装成一颗cpu,分布式慢速存储是将N个硬盘组装成一个大硬盘,memcached是将N块内存组装成一块大内存。
有个朋友问:那是不是代价很昂贵啊。我的回答是肯定的。如果你的网站规模只有三两台服务器的话,我觉得你就不用考虑这样的方案了,等你的网站做大了以后,再参考这方面的资料即可。一般都是比较大的互联网公司为了追求更好的用户体验,才进行这方面的投资,对他们来讲,用户体验至上,money是小case。
还有朋友问:有一些dbms提供内存表的功能,比如mysql的内存表,可以代替memcache d。但我要建议你的是:mysql的内存表确实起到同样的作用,但它的局限也很多,往往不能让你随心所欲,所以建议你不要走弯路。
二、memcached的应用场景
2.1 应用范围
memcached产品或相关技术的应用,我们在前面已经提到了一些。其实它的应用还是非常普遍的,应用作为广泛的领域:例如sns类网站、blog类网站、bbs类网站以及im后台服务。
2.2 sns类网站的应用
是99年始于校园中的项目,有点像中国的校内网。几个学生纯属出于爱好做了这样一个网站,主要实现以下功能:sns、blog、bbs和rss等。livejournal从建立开始就采用了大量的开源软件,到现在它本身也衍生了不少开源软件。sns网站,现在比比皆是,规模比较大的象开心、校内、51,它们的页面上往往需要引用大量的用户信息、好友信息以及
文章信息等,所以跨表或跨库操作会相当多。如果这些功能全部直接操作数据库,显然会带来极大的效率损耗和系统负载。memcached在这样的场景下就会发挥巨大的作用,它采用大内存把这些不变的数据全都缓存起来,当数据修改时就通知cache过期,这样应用层基本上就可以解决大部分问题了,只有很小一部分请求穿透应用层,用到数据库。
2.3 blog、bbs类网站的应用
象这些流量巨大的blog系统,它需要频繁读写的一些小数据。其中最典型的应用,我们通常成为“数字类服务”,比如blog中需要实时显示的用户点击数和阅读数,bb s中需要记录的在线人数、在线用户等。这些小数据的处理非常繁琐,你无论怎么去设计数据库,都很难避开跨表或者跨库。有的朋友会说,可以在数据库中增加冗余字段解决这类问题,但事实上,这既不符合数据库设计的范式规则,也很难做到数据的一致性,由此会引发更为复杂的问题。而且由于产品线的分散发展,数据已经很难做到完全的统一规划。memcached在这样的场景下就会将这些小数据进行缓存,定期持久化就可以了,查询操作一直都在内存中运行。说到这里,有的朋友又会想到一些其它的问题:“memcached server宕机了怎么办,怎么保证与数据库的数据一致”。我会对你说:“你的问题非常好,我们将会在后面章节给出相应的解决方案”。另外,其实这种小数据并不是关键性数据,即使偶尔发生点错误,也没太大的问题。blog、bbs 系统并不是严格的企业级系统,假如你是为银行业务提供解决方案的话,memcached并不适合。
2.4 im server的应用
前些时间,有一些文章介绍memcached 在Jabber上应用。写累了,喝口水,读者自己去找找资料吧,有时间的话,帮我补上吧,呵呵。
我们举了几个例子来说明memcached的应用场景,似乎都局限于小数据服务,那是不是就不能用于较大数据的缓冲了?那绝不是,memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等等,而且生产环境中就这么跑过,只不过让大数据量使用缓冲的话,有点太浪费了,同样数量的内存存不了几条数据,所以会明显的降低命中率。
哈希分布与一致性哈希算法简介
前言
在我们的日常web应用开发当中memcached可以算作是当今的标准开发配置了。相信memcache的基本原理大家也都了解过了,memcache虽然是分布式的应用服务,但分布的原则是由client端的api来决定的,api根据存储用的key以及已知的服务器列表,根据key的hash计算将指定的key存储到对应的服务器列表上。
基本的原理以及分布
在这里我们通常使用的方法是根据key的hash值%服务器数取余数的方法来决定当前这个key的内容发