整个网站应用中,缓存几乎无处不在,既存在于浏览器、也存在于应用服务器和数据库服务器;既能够对数据缓存(分布式缓存),也能够对文件缓存(分布式存储系统),还能够对页面片断缓存(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.一致性哈希算法