Memcached是以 LiveJournal 旗下 DangaInteractive 公司的 Brad Fitzpatric 为首开发的一款高性能的分布式内存缓存服务器。算法
add('key', 'value' ,'expire')
:key不存在则保存replace('key', 'value', 'expire')
:key存在则保存,会覆盖旧值set('key', 'value', 'expire')
:直接保存get('key')
get_multi('key')
:获取多个keydelete('key', 'block time')
:能够设置指定时间内禁止新增该keyincr('key')
问题背景:内存的分配是经过对全部记录简单地进行malloc
和free
来进行,但这种方式致使内存碎片,加剧操做系统内存管理器的负担。缓存
机制原理:按照预先规定的大小,将分配的内存分割成特定长度的块,以彻底解决内存碎片问题。服务器
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机制即将分配好的内存页(Page)分割成各类尺寸的块(Chunk),并把尺寸相同的块组合成组(Slab Class)。memcached
Memcached会维护着一份Slab中空闲Chunk的列表,当每次存储数据时,会根据数据大小选择最合适的组(以减小空间浪费)。性能
但即便使用了列表记录空闲的块,仍是没法作到彻底消除空间的浪费,而最优的方案只能是减小各个块之间的大小差距,从而可让缓存的数据恰好选择一个差异不大的块进行存储。而这个调优参数便是 Growth Factor 因子,默认值为1.25。操作系统
memcached不会释放已分配的内存,记录超时后,客户端就没法再看见该记录(invisible,透明),其存储空间便可重复使用。code
同时,memcached内部不会监视记录是否过时,而是在get
请求访问记录时,检查记录的时间戳。该机制称为 Lazy Expiration(惰性过时)。cdn
删除原理:采用 LRU(Least Recently Used)来分配空间。blog
memcached是经过分布式算法将入参映射到具体的存储节点,从而实现分布式存储。
Memcached原始的分布式是模运算。
特色:算法简单、数据分散性优秀
缺点:当机器节点改变时,数据散列受到影响,从而缓存命中率会降低
算法改进:一致性Hash算法
首先求出memcached服务器(节点)的哈希值,并将其配置到 0 ~ 2^32的圆(continuum)上。而后用一样的方法求出存储数据的键的哈希值,并映射到圆上。而后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。若是超过 2^32 仍然找不到,就会保存到第一台memcached服务器上。
当往上图状态添加一台服务器时,只有在continuum上增长服务器的地点逆时针方向的第一台服务器的键会受到影响。