memcached特性

1.分布式缓存,kv结构
2.基于文本的简单协议(也有二进制支持)
3.采用libevent,封装了linux下的epoll和bsd的kqueue,提供统一接口,连接数再多也能提供O(1)的性能。
4.每个memcached进程间不通信,需要客户端提供分布式算法。
5.Slab Allocation分配机制,解决内存碎片问题,预先分配适量的内存chuck,根据缓存对象size来找到空闲合适大小的chuck来存储。
 重复利用内存,不存在碎片问题,但是存在空间浪费,比如128byte的chuck只存了111byte,造成17byte的空间浪费,
 无法完美解决,可以通过设置chuck的growth factor,来调整chuck间增长的因数,让chuck大小适度。
6.对象过期策略。memcached不会释放内存,只会标记对客户端是否可见visible,该空间可被覆盖来重复利用。
 Lazy Expiration,它不会监视是否过期,只会在取得时候比较时间戳。 
7.当发现内存不足时,无法找到合适的空间来存放,则使用LRU算法来淘汰,用新对象来覆盖。
8.客户端分布式算法,类似负载均衡,避免单点。
 1)key hash % node num,来取服务器节点。若添加移除节点时候(或某节点挂掉),将导致缓存大面积失效。
 2)一致性hash,一种特别的hash算法来寻找节点,节点挂掉后失效的缓存量很小。
   算法:首先求出memcached服务器(节点)的哈希值,并将其配置到0~2^32(顺时针从0~2^32排列)
 的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数
 据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找不到
 服务器,就会保存到第一台memcached服务器上。(在Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向
 的第一台服务器上的键会受到影响)

猜你喜欢

转载自wcj10051891.iteye.com/blog/1938849