《Memcached全面剖析》笔记

1 基础

Memcached是以 LiveJournal 旗下 DangaInteractive 公司的 Brad Fitzpatric 为首开发的一款高性能的分布式内存缓存服务器。算法

1.1 特征

  • 协议简单:简单的基于文本行的协议
  • 基于libevent事件处理
  • 内置内存存储方式
  • memcached不互通讯的分布式:”分布式“没有在服务器端实现,而是取决于客户端。

memcached的分布式

1.2 指令

保存数据

  • add('key', 'value' ,'expire'):key不存在则保存
  • replace('key', 'value', 'expire'):key存在则保存,会覆盖旧值
  • set('key', 'value', 'expire'):直接保存

获取数据

  • get('key')
  • get_multi('key'):获取多个key

删除数据

  • delete('key', 'block time'):能够设置指定时间内禁止新增该key

增一/减一

  • incr('key')

2 内存存储

Slab Allocation机制

问题背景:内存的分配是经过对全部记录简单地进行mallocfree来进行,但这种方式致使内存碎片,加剧操做系统内存管理器的负担。缓存

机制原理:按照预先规定的大小,将分配的内存分割成特定长度的块,以彻底解决内存碎片问题。服务器

The primary goal of the slabs subsystem in memecached was to eliminate memory fragmentation issues totally by using fixed-size memory chunks coming from a few predetermined size classes.分布式

Slab Allocation 构造图

如图所示,Slab Allocation机制即将分配好的内存页(Page)分割成各类尺寸的块(Chunk),并把尺寸相同的块组合成组(Slab Class)。memcached

Memcached会维护着一份Slab中空闲Chunk的列表,当每次存储数据时,会根据数据大小选择最合适的组(以减小空间浪费)。性能

Slab缓存数据原理

但即便使用了列表记录空闲的块,仍是没法作到彻底消除空间的浪费,而最优的方案只能是减小各个块之间的大小差距,从而可让缓存的数据恰好选择一个差异不大的块进行存储。而这个调优参数便是 Growth Factor 因子,默认值为1.25。操作系统

3 删除机制

memcached不会释放已分配的内存,记录超时后,客户端就没法再看见该记录(invisible,透明),其存储空间便可重复使用。code

同时,memcached内部不会监视记录是否过时,而是在get请求访问记录时,检查记录的时间戳。该机制称为 Lazy Expiration(惰性过时)。cdn

删除原理:采用 LRU(Least Recently Used)来分配空间。blog

4 分布式算法

分布式简介:添加时

memcached是经过分布式算法将入参映射到具体的存储节点,从而实现分布式存储。

Memcached原始的分布式是模运算。

特色:算法简单、数据分散性优秀

缺点:当机器节点改变时,数据散列受到影响,从而缓存命中率会降低

算法改进:一致性Hash算法

一致性Hash基本原理

首先求出memcached服务器(节点)的哈希值,并将其配置到 0 ~ 2^32的圆(continuum)上。而后用一样的方法求出存储数据的键的哈希值,并映射到圆上。而后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。若是超过 2^32 仍然找不到,就会保存到第一台memcached服务器上。

一致性Hash:添加服务器

当往上图状态添加一台服务器时,只有在continuum上增长服务器的地点逆时针方向的第一台服务器的键会受到影响。

5 应用和兼容程序

参考

  • 《Memcached全面剖析》 —— 长野雅广、前坂撤