Neo's Blog

不抽象就无法深入思考
不还原就看不到本来面目!

0%

MC缓存必知必会

memcached作为高速运行的分布式缓存服务器,具有以下的特点:

(1)协议简单,文本协议

(2)基于libevent的事件处理,对服务器的连接数增加,也能发挥O(1)的性能

操作:

(1)set, get, del

(2)多key查询

(3)原子自增,自减

memcache内存分配

Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。但是存在内存浪费问题!!(外碎片没有了,但是当分配大小超过实际要用大小时,产生内部碎片)

memcache删除机制

Lazy Expiration

基于LRU(Least Recently Used)算法自动删除不使用的缓存

memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。

当容量存满时,会对缓存中的数据进行剔除,剔除时除了会对过期 key 进行清理,还会按 LRU 策略对数据进行剔除。

1.4以前:

维护一个双向链表,当被访问时,移动到head; 当需要淘汰时,从尾巴开始扫描,找到已经过期的item淘汰掉。

1.5以后:

维护子LRU(HOT\WARM\COLD),有点类似多级队列。

哈希算法

memcached不互相通信的分布式,由客户端来实现

根据余数计算分散

数据的分散性也相当优秀,但也有其缺点。那就是当添加或移除服务器时,缓存重组的代价相当巨大。
添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器,从而影响缓存的命中率。

一致性Hash

但Consistent Hashing中,只有在continuum(统一连续体)上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。Consistent Hashing最大限度地抑制了键的重新分布。

而且,有的Consistent Hashing的实现方法还采用了虚拟节点的思想。使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。

因此,使用虚拟节点的思想,为每个物理节点(服务器)在continuum上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。

hash表扩容

基于双缓冲思想的扩容方案

启动一个后台线程,监控hash表大小,如果快满了,则拷贝到新的hash表【扩大容量】

你的支持是我坚持的最大动力!