Memcached全面剖析

我只是一个虾纸丫 提交于 2019-12-03 00:37:58

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

一、合理使用缓存

1.频繁修改的数据

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

2.没有热点的数据

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

3.数据不一致与脏读

    一般会对还存的数据设置失效时间,一旦超过失效时间,就会从数据库重新加载,因此应用要容忍一定时间的数据不一致。

4.缓存可用性

    为了应对当缓存服务崩溃时,数据库会因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用(缓存雪崩故障),可以通过缓存热备或者分布式缓存服务器集群来改善缓存的可用性。

5.缓存预热

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

6.缓存穿透

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

二、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 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。

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

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!