数据库可以分为两大类,一类为关系型数据库,例如我们之前使用过的MySQL,另一类是非传统关系型数据库,我们称之为NoSQL(Not Only SQL)。NoSQL包括k/v数据库(Key-value Store)、文档数据库(Document Store)、列存数据库(Column Store)、图数据库(Graph DB)和时序数据库(Time Series)等分类,memcached属于k/v数据库的一种,是一款高速运行的分布式缓存服务器。

  1. memcached特点

    memcached具有如下特点:

    ①基于Key-Value做内存缓存

    memcached只支持能序列化的数据类型,不支持持久化,它是基于Key-Value的内存缓存系统。

    ②集群同步功能

    memcached虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使有任何一台memcached发生故障,只要集群中有一台memcached可用就不会出现数据丢失,当其他memcached重新加入到集群的时候,可以自动从有数据的memcached当中自动获取数据并提供服务。

    ③高效读写

    memcached借助了操作系统的libevent工具做高效的读写。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口,即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

    ④实现session共享

    memcached支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached最适合保存用户的session实现session共享。

    ⑤采用Slab Allocator机制

    memcached存储数据时,memcached会去申请1MB的内存,把该块内存称为一个slab,也称为一个page。

    ⑥支持多语言

    memcached支持多种开发语言,包括JAVA、C、Python、PHP、C#、Ruby和Perl等。


  1. memcached工作机制

2.1 内存分配机制

    应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用,memcached采用了Slab Allocator机制来分配、管理内存。在memcached中,我们需要注意Page、Chunk和Slab Class这三个关键术语:

    ①Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab,Slab分配之后内存按照固定字节大小等分成chunk。

    ②Chunk:用于缓存记录k/v值的内存空间,memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费。Chunk最大就是Page的大小,即一个Page中就一个Chunk。

    ③Slab Class:Slab按照Chunk的大小分组,就组成不同的Slab Class,第一个Chunk大小为96B的Slab为Class 1,Chunk大小为120B的Slab为Class 2,如果有100bytes要存,那么Memcached会选择Slab Class 2 存储,因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默认1.25。

2.2 懒过期机制

    memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,就把数据有效期限标识为0,并不清除该数据,以后可以覆盖该位置存储其它数据。

2.3 LRU机制

    当内存不足时,memcached会使用LRU(Least Recently Used,最近最少使用)机制来查找可用空间,分配给新记录使用。

2.4 集群机制

    memcached集群,称为基于客户端的分布式集群,是由客户端实现集群功能,即memcached本身不支持集群。另外memcached集群内部并不互相通信,一切都需要客户端连接到memcached服务器后自行组织这些节点,并决定数据存储的节点。


  1. memcached工作原理

    ①memcached是基于key-value的方式来做内存缓存的,所以它的处理对象是一个个的kv对,key在经过哈希算法转化成hash-key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。

    ②memcached是C/S架构的,由服务器端(server)和客户端(client)两个核心组件组成,在一个memcached的查询中,client先通过计算key的哈希值来确定kv对所处在的server位置。当server确定后,客户端就会发送一个查询请求给对应的server,让它来查找确切的数据。因为这之间没有交互以及多播协议,所以memcached交互带给网络的影响是最小化的。