Memcached全面剖析

    整个网站应用中,缓存几乎无处不在,既存在于浏览器、也存在于应用服务器和数据库服务器;既能够对数据缓存(分布式缓存),也能够对文件缓存(分布式存储系统),还能够对页面片断缓存(ESI)。算法

1、合理使用缓存数据库

1.频繁修改的数据浏览器

    缓存主要存放读写比很高、不多变化的数据。通常说来,数据的读写比在2:1以上,如商品类目信息、热门搜索列表信息等。
缓存

2.没有热点的数据
服务器

    若是应用系统访问数据没有热点,不遵循二八定律,即大部分数据并无集中在小部分数据上,那么缓存就没有意义。
架构

3.数据不一致与脏读并发

    通常会对还存的数据设置失效时间,一旦超过失效时间,就会从数据库从新加载,所以应用要容忍必定时间的数据不一致。
分布式

4.缓存可用性memcached

    为了应对当缓存服务崩溃时,数据库会由于彻底不能承受如此大的压力而宕机,进而致使整个网站不可用(缓存雪崩故障),能够经过缓存热备或者分布式缓存服务器集群来改善缓存的可用性。
高并发

5.缓存预热

    能够在缓存系统启动时就把热点数据加载好,这个缓存预加载手段叫做缓存预热。经常使用于元数据如城市地名列表、类目信息等。

6.缓存穿透

    若是由于不恰当的业务、或者恶意攻击持续高并发地请求某个不存在的数据,因为缓存没有保存该数据,全部请求都会落到数据库上,会对数据库形成很大压力,甚至崩溃。一个简单的对策就是将不存在的数据也缓存起来(value为null)。

2、Memcached高效的内存管理

    Memcached采用一种集中式的缓存集群管理,也称做互不通讯的分布式架构方式。它具备协议简单基于libevent的事件处理机制(通讯模块)

协议简单:1.通讯协议 TCP|UDP

             2.通讯序列化协议  基于文本的自定义协议

    1. Slab Allocation机制

    Memcached使用一个简单的办法——固定空间分配,它是按照预先规定的大小,将分配的内存分割成特定长度的块,内存(chunk),并把尺寸相同的块分红组,来内存碎片管理问题。Memcached详细内存分配策略

Slab Allocation构造图

    Slab Allocation主要术语:

        Page:分配给Slab的内存空间,默认是1MB。分配给Slab以后根据slab的大小切分红chunk。

        Chunk:用于缓存记录的内存空间

        Slab Class:特定大小的chunk的组。

    2.在Slab中缓存记录的原理

    Memcached根据收到的数据的大小,选择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk, 而后将数据缓存于其中。

    

    Slab Allocator机制解决了内存碎片问题,但也带来了新的问题。即因为分配的是特定长度的内存,所以没法有效利用内存。如:将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。

    3.Memcached数据的删除机制

    Lazy Expiration:memcached内部不会监视记录是否过时,而是在get时查看记录的时间戳,检查记录是否过时。 这种技术被称为lazy(惰性)expiration。所以,memcached不会在过时监视上耗费CPU时间。

    Memcached不会释放已分配的内存。记录超时后,客户端就没法再看见该记录(invisible,透明),其存储空间便可重复使用。

    Memcached会优先使用已超时的记录的空间,但即便如此,也会发生追加新记录时空间不足的状况, 此时就要使用名为 Least Recently Used(最近最少使用  LRU)机制来分配空间。所以,当memcached的内存空间不足时(没法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。

 3、互不通讯的服务器集群架构(分布式)

     Memcached虽然称为“分布式”缓存服务器,但服务器端并无“分布式”功能。memcached的分布式是彻底由客户端程序库实现的。 这种分布式是memcached的最大特色。

    路由算法:1.根据余数计算分散       2.一致性哈希算法