memcached架构及缓存策略

----------------------------------------概述----------------------------------------

Memcached是一套高性能分布式内存对象缓存服务器php

它将全部的数据通通保存在内存中,在内存中会维护一个巨大的hash表,支持任意存储类型的数据,不少网站经过Memcached提升网站的访问速度,尤为是对于大型的须要频繁访问的网站,减小查询效率,提升查询速度数据库

----------------------------------------架构----------------------------------------

C/S架构:后端

服务端:Memcached服务端,经过C语言编写而成缓存

客户端:Memcached API客户端,能够经过任何语言编写,如php、py等服务器

特色:架构

1.为了提升性能,memcached中保存的数据都存储在memcached内置的内存空间中:因为数据仅存在于内存中,所以重启memcached、重启操做系统会致使所有数据消失分布式

2.基于libevent的事件处理:libevent是个程序库,它将Linux的epoll、BSD类操做系统的kqueue等事件处理功能封装成统一的接口;即便对服务器的链接数增长,也能发挥O(1)的性能;memcached使用这个libevent库,所以能在Linux、BSD、Solaris等操做系统上发挥其高性能memcached

3.简单key/value存储:服务器不关心数据自己的意义及结构,只要是可序列化数据便可;存储项由“键、过时时间、可选的标志及数据”四个部分组成性能

4.功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及没法链接至服务器时采用相应的动做;服务端负责接收、存储数据,并负责数据项的超时过时网站

----------------------------------------缓存策略----------------------------------------

Slab Allocator机制基本原理:

按照预先规定的大小,将分配的内存分割成特定长度的块chunk,并把尺寸相同的块分红组,以彻底解决内存碎片问题。但因为分配的是特定长度的内存,所以没法有效利用分配的内存。好比将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了;按照预先规定的大小,将分配的内存分割成特定长度的内存块chunk,再把尺寸相同的内存块分层组chunk集合,这些内存不会释放,能够反复利用


Slab Allocation机制角色:

1.chunk为固定大小的内存空间,默认为96Byte

2.page对应实际的物理空间,1个page为1M

3.一样大小的chunk集合又称为slab


客户端选择slab机制:

下面说明memcached如何针对客户端发送的数据选择slab并缓存到chunk中;memcached根据收到的数据的大小,选择最适合数据大小的slab; memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk, 而后将数据缓存于其中


内存释放机制:

Laxzy Expiration:

Memcached每一个被存取的对象都有惟一的标识符key,存取操做均经过key进行,例如能够把后端数据库中的select操做提取出来,而后对相应的SQL进行hash计算得出key,而后以这个key在memcached中查找数据,若是数据不存在,说明其还没有被写入缓存中,并设置一个失效时间(好比1小时),在失效时间内的数据都是从缓存中提取,这样就有效地减小了数据库的压力

Least Recently Used(LRU):

删除“最近最少使用”的记录的机制;当memcached的内存空间不足时,从最近未被使用的记录中搜索,并将其空间分配给新的记录;-M 参数禁止LRU功能,内存用尽时,memcached会返回错误,不建议使用memcached -M -m 1024