您的位置:首页 > 数据库 > Memcache

memcache工作原理介绍

2016-06-02 18:57 411 查看
一. Memcached简介
Memcached 是一个高性能的分布式内存对象缓存系统,现在很多的大型web应用程序包括Facebook, LiveJournal,mixi, Digg等等都在使用memcached来支持他们每天数亿级的页面访问。通过把cache层与他们的web架构集成,他们的应用程序在提高了性能的同时,还大大降低了数据库的负载。

二. Memcached的产生背景
对于大数据、高并发、高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题。当一个数据池连接数峰值已经达到500的时候,那运行的程序离崩溃的边缘也不远了。很多小网站的开发人员一开始都将注意力放在了产品需求设计上,缺忽视了程序整体性能,可扩展性等方面的考虑,结果眼看着访问量一天天往上走,可突然发现有一天网站因为访问量过大而崩溃了,后果是非常严重的。

大家都知道,当有一个request过来后,web服务器交给IIS服务器,IIS处理并从db中存取相关数据,但db存取的花费是相当高昂的。特别是每次都取相同的数据,等于是让数据库每次都在做高耗费的无用功,数据库如果会说话,肯定会发牢骚,你都问了这么多遍了,难道还记不住吗?是啊,如果IIS拿到第一次数据并存到内存里,下次读取时直接从内存里读取,而不用麻烦数据库,这样不就给数据库减负了?而且从内存取数据必然要比从数据库媒介取快很多倍,反而提升了应用程序的性能。

因此,我们可以在业务逻辑层与db层之间加一层cache层,主要目的:

1. 减少数据库读取负担;

2. 提高数据读取速度。而且,cache存取的媒介是内存,而一台服务器的内存容量一般都是有限制的,不像硬盘容量可以做到TB级别。所以,可以考虑采用分布式的cache层,这样更易于破除内存容量的限制,同时又增加了灵活性。

三. Memcached的安装

下载Memercached For Windows,如果你的系统是Linux,可以下载Memercached  For Linux版本。
     2.  安装步骤
   (1)解压到指定目录,如:C:\Memcached\memcached-win32-1.4.4-14。
   (2)用cmd打开命令窗口,转到解压的目录,输入 “memcached.exe -d install”。
   (3)打开控制面板,打开服务,可以看到memcached已经在上面可,如果没有启动,则手动启动一下。 
 四.Memcached的工作原理
Memcached处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个hash算法转化成hash-key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。

Memcached有两个核心组件组成:服务器端(server)和客户端(client),在一个memcached的查询中,client先通过计算key的hash值来确定kv对所处在的server位置。当server确定后,客户端就会发送一个查询请求给对应的server,让它来查找确切的数据。因为这之间没有交互以及多播协议,所以memcached交互带给网络的影响是最小化的。

举例说明:考虑以下这个场景,有三个client分别是c1,c2,c3,还有三个ms分别是s1,s2,s3:

设置kv对

c1想设置key=”com”,value=”iQiyi”

c1拿到server列表,并对key做hash转化,根据hash值确定kv对所存的server位置

s2被选中了

c1连接上s2,s2收到请求,把(key=”com”,value=”iQiyi”)存了起来

获取kv对

c3想得到key=”com”的value

c3用相同的hash算法算出hash值,并确定key=”aa”的值存在s2上

c3连接上s2,并从s2那边得到value=”iQiyi”

其他任何从c1,c2,c3的想得到key=”com”的值的请求都会发向s2

五.Memcached的内存管理机制
memcached会预先分配内存,首先,这里有3个概念:

1.  slab

2.  page

3 . chunk

解释一下,一般来说一个memcahced进程会预先将自己划分为若干个slab,每个slab下又有若干个page,每个page下又有多个chunk,如果我们把这3个咚咚看作是object得话,这是两个一对多得关系。再一般来说,slab得数量是有限得,几个,十几个,或者几十个,这个跟进程配置得内存有关。而每个slab下得page默认情况是1m,也就是说如果一个slab占用100m得内存得话,那么默认情况下这个slab所拥有得page得个数就是100,而chunk就是我们得数据存放得最终地方。

 
Memcached的内存分配以page为单位,默认情况下一个page是1M ,可以通过-I参数在启动时指定。如果需要申请内存 时,memcached会划分出一个新的page并分配给需要的slab区域。Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储,其大小可以通过启动参数设置增长因子,默认为1.25,即下一个slab的大小是上一个的1.25倍。如 下图,每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。如下图所示,需要存储一个100Bytes的对象时,会选用112Bytes的Slab
Classes,如下图所示:

 
六.Memcached的缓存策略
当ms的hash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用),以及每个kv对的有效时限。Kv对存储有效时限是在mc端由app设置并作为参数传给ms的。
同时ms采用是偷懒替代法,ms不会开额外的进程来实时监测过时的kv对并删除,而是当且仅当,新来一个插入的数据,而此时又没有多余的空间放了,才会进行清除动作。
七.Memcached的客户端
Memcached客户端有各种语言的版本供大家使用,包括Java,c,PHP,.net等等。其中面向Java的三种Memcached客户端包括memcached
client for java、spymemcached和xmemcached  。

八.Memcached与SqlServer整合
1,查询数据(select),首先通过指定的Key查询 (get)Memcache中间缓存层数据,如果存在相对应数据,则直接获取出数据结果,查询过程完全不需要查询数据库。如果不存在,则查询MySQL数 据库,并以key对应value的形式将查询结果存储在Memcache缓存数据中,然后将结果返回给查询语句。
2,更新 数据(update),首先更新数据,然后删除相关的memcache数据(delete)。
3,增加 数据(add),首先删除相关缓存数据,然后增加数据。
4,删除数据(delete), 删除数据,并删除Memcache数据。

详细原理:http://www.mamicode.com/info-detail-1120932.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: