MemCache知识集锦

1.MemCache定义:是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用,以减轻数据库的负载。其通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高网站访问的速度。其是存储键值对的HashMap,在内存中对任意数据使用k-v存储,数据可来源于数据库调用、API调用、页面渲染结果。
2.MemCache功能概括:快速部署,易于开发,能解决面对大规模数据缓存的许多难题。
3.MemCache与MemCached的区别:
前者是项目名称,后者是前者服务器端可执行文件的名称。
4.MemCache访问模型:阿里技术专家李智慧老师-《大型网站技术架构 核心原理与案例分析》MemCache部分
特别强调:MemCache被称为"分布式缓存",但其本身完全不具备分布式功能,MemCache集群之间不会相互通信(与之对比,JBoss Cache某台服务器有缓存数据更新,会通知集群中其他机器更新缓存或清除缓存数据),所谓的"分布式",完全依赖于客户端程序的实现,如图所示:


5.基于上图,梳理MemCache一次写缓存的流程
1、应用程序输入需要写缓存的数据
2、API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号
3、由服务器编号得到MemCache及其ip地址和端口号
4、API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作
5、读缓存和写缓存一样,使用相同的路由算法和服务器列表,应用程序只要查询的是相同的Key,MemCache就能保证缓存命中。
6.原理:这种MemCache集群的方式也是从分区容错性的方面考虑的,加入Node2宕机,Node2上存储的数据都不可用了,由于集群中Node1和Node2还存在,下次请求Node2中存储的Key值时,肯定没有命中,这时会先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0和Node1中选取一个节点,把对应的数据放进去,这样下次访问就可以走缓存了。
7.以上表明对服务器集群的管理,路由算法至关重要,就和负载均衡一样,路由算法决定着该访问集群中的哪台服务器。
8.实例>>简单路由算法:
1、>>余数Hash算法:String str 对应HashCode是50、服务器数目3 取余数是1 则str对应节点Node1 路由算法把str路由到Node1服务器上。 保证缓存数据在整个服务器集群中有比较均衡的分布。(不考虑服务器集群伸缩性,余数Hash算法几乎满足绝大多数缓存路由需求,但是当分布式缓存集群需要扩容的时候就比较难办了):当大部分被缓存的数据因为服务器扩容而不能正确读取时,数据访问的压力就落在数据库的身上了,这将大大超过数据库的负载能力,严重的可能导致数据库宕机。

2、>>一致性Hash算法:假设长度为232的整数环(一致性Hash环),根据节点名称的Hash值(分布为[0,232-1])将缓存服务器节点分配在该环上,对缓存的数据Key值进行Hash算法,然后按环的顺时针查找距离该key最近的服务器节点,完成key到服务器的映射查找(如图所示)。




如果增加一台服务器节点(如图所示),则影响一个key的值(本来在Node1,新加一个节点到了最近的Node4),因此采用一致性Hash算法也会影响整个集群,但只是影响加粗的那一段而已,相比余数Hash算法,这个影响小的多,更有其特质:随着集群规模的增大,继续命中原有缓存数据的概率会越来越小,虽有少数不能被读到,但是这个比例足够小,即使访问数据库也不会造成致命的负载压力。




9.MemCache实现原理:
MemCache数据存放在内存中几点情况说明:
<1>访问数据速度比传统的关系型数据库要快(传统关系型数据库为了保持数据的持久性,数据存放在硬盘中,IO操作慢)。
<2>MemCache数据存放在内存中意味着只要被重启了,数据就会消失。
<3>MemCache数据存放在内存中势必受到机器位数的限制。
因此,MemCache将内存空间分为一组slab,每个slab有若干个page,每个page默认是1M(如:一个slab占用100M内存的话,那么这个slab下应该有100个page)
每个page里包含一组chunk(真正存放数据的地方),同一个slab里的chunk大小是固定的,有相同大小chunk的slab被组织在一起,成为slab_class。
MemCache内存分配的方式称为allocator,slab的数量是有限的,和启动参数的配置有关。
针对MemCache的内存分配及回收算法总结三点:
1.MemCache内存分配chunk里面会有内存浪费,88字节的value分配在128字节的chunk中,就损失了30字节,同时也避免了管理内存碎片的问题。
2.MemCache的LRU算法不是针对全局的,是针对slab的。
3.一个新数据过来,slab会先以page为单申请一块内存,申请的内存最多只有1M,所以value大小自然不能大于1M。
10.总结MemCache特性与限制:
<1>MemCache中可保存到item数据没有上限,内存足够就行。
<2>MemCache单进程在32位机中最大使用内存为2G,64位机则没有限制。
<3>key最大为250字节,超过该长度无法存储。
<4>单个item最大数据是1MB,超过1MB的数据不予存储。
<5>MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效。
<6>不能够遍历MemCache中所有的item,该速度相对缓慢容易阻碍其他操作。
<7>MemCache高性能源自两阶段哈希结构:一阶段在客户端,通过Hash算法根据Key值算出一个节点;二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回  给客户端,从实现的角度看,MemCache是一个非阻塞的、基于事件的服务器程序。
<8>MemCache设置添加某一个Key值,传入expiry为0表示这个key值永久有效,失效时间为30天,开发者无法改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值