整个网站应用中,缓存几乎无处不在,既存在于浏览器、也存在于应用服务器和数据库服务器;既可以对数据缓存(分布式缓存),也可以对文件缓存(分布式存储系统),还可以对页面片段缓存(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.一致性哈希算法
来源:oschina
链接:https://my.oschina.net/u/2256974/blog/652148