设为首页 收藏本站
查看: 1400|回复: 0

[经验分享] Memcached 工作原理介绍

[复制链接]

尚未签到

发表于 2015-11-18 15:32:15 | 显示全部楼层 |阅读模式
一. Memcached简介

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

  对于大数据、高并发、高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题。当一个数据池连接数峰值已经达到500的时候,那运行的程序离崩溃的边缘也不远了。很多小网站的开发人员一开始都将注意力放在了产品需求设计上,缺忽视了程序整体性能,可扩展性等方面的考虑,结果眼看着访问量一天天往上走,可突然发现有一天网站因为访问量过大而崩溃了,后果是非常严重的。
  大家都知道,当有一个request过来后,web服务器交给app服务器,app处理并从db中存取相关数据,但db存取的花费是相当高昂的。特别是每次都取相同的数据,等于是让数据库每次都在做高耗费的无用功,数据库如果会说话,肯定会发牢骚,你都问了这么多遍了,难道还记不住吗?是啊,如果app拿到第一次数据并存到内存里,下次读取时直接从内存里读取,而不用麻烦数据库,这样不就给数据库减负了?而且从内存取数据必然要比从数据库媒介取快很多倍,反而提升了应用程序的性能。
  因此,我们可以在web/app层与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就是我们得数据存放得最终地方。下图是slab下的page图片


Chunk

用于缓存记录的内存空间。

Slab Class

特定大小的chunk的组。


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


六.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与Mysql整合

Memcache和MySQL 交互流程图如下

   

下面详细了解Memcache各类数据操作原理:

1,查询数据(select),首先通过指定的Key查询 (get)Memcache中间缓存层数据,如果存在相对应数据,则直接获取出数据结果,查询过程完全不需要查询数据库。如果不存在,则查询MySQL数 据库,并以key对应value的形式将查询结果存储在Memcache缓存数据中,然后将结果返回给查询语句。

2,更新 数据(update),首先更新数据,然后删除相关的memcache数据(delete)。

3,增加 数据(add),首先删除相关缓存数据,然后增加数据。

4,删除数据(delete), 删除数据,并删除Memcache数据。

  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140826-1-1.html 上篇帖子: 高性能缓存Memcached使用教程 下篇帖子: Redis VS. Memcached 均不适合数据量高于1千万条,且保证数据完整的key-value存储
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表