memcached概述与应用场景

概述:Memcached是国外社区网站 LiveJournal 的开发团队开发的一套高性能的分布式内存对象缓存服务器。它将所有的数据统统保存在内存中,在内存中会维护一个巨大的hash表,支持任意存储类型的数据,很多网站通过Memcached提高网站的访问速度,尤其是对于大型的需要频繁访问的网站,减少查询效率,提高查询速度;

缓存应用系统:计算机体系存储系统模型扩展到应用也是一样,应用需要数据,数据哪里来?缓存(更快的存储)->DB(较慢的存储),他们的工作流程大致如下图所示:

memcached概述与应用场景

架构:C/S架构

服务端:Memcached服务端,通过C语言编写而成;

客户端:Memcached API客户端,可以通过任何语言编写,如php、py等;

特点:

1.为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失;

2.基于libevent的事件处理:libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥I/O的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能;

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

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

 

三、运行架构:

memcached概述与应用场景

 

四、Memcached缓存存储策略;

内存缓存策略: Slab Allocation机制

Slab Allocator机制基本原理:按照预先规定的大小,将分配的内存分割成特定长度的块(chunk),并把尺寸相同的块分成组,以完全解决内存碎片问题。但由于分配的是特定长度的内存,因此无法有效利用分配的内存。比如将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了;

按照预先规定的大小,将分配的内存分割成特定长度的内存块(chunk),再把尺寸相同的内存块分层组(chunk集合),这些内存不会释放,可以反复利用;

 

memcached概述与应用场景

 

Slab Allocation机制角色:

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

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

3.同样大小的chunk又称为slab。

memcached概述与应用场景

 

客户端选择slab机制:

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

 

内存释放机制:

Laxzy Expiration:Memcached每个被存取的对象都有唯一的标识符key,存取操作均通过key进行,例如可以把后端数据库中的select操作提取出来,然后对相应的SQL进行hash计算得出key,然后以这个key在memcached中查找数据,如果数据不存在,说明其尚未被写入缓存中,并设置一个失效时间(比如1小时),在失效时间内的数据都是从缓存中提取,这样就有效地减少了数据库的压力;

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

 

五、Memcached优缺点:

优点:

1.读写性能优异,特别是高并发时和文件缓存比有明显优势;

2.memcached组建支持集群,并且是自动管理负载均衡;

3.开源,占用资源小,协议简单的软件,实现了数据库和web之间的数据缓存功能,减少数据库的检索次数,减少数据库的I/O,解决了架构数据库端的压力;

4.存储方式:内置于内存存储方式,存取的效率高,执行的速度快;

缺点:

1.缓存空间有限:据说一台电脑的mem缓存开到2g以上会出现不稳定,数据无故丢失的现象;

2.掉电丢失数据:由于是把数据放在内存里的,所有一旦机器掉电,数据也就全部丢失了。

一般建议:而mem则适合放一些频繁更改的数据,比如可以把session数据放进mem;