Memcached深入学习总结
在上一家公司时,产品主要使用memcached做缓存。
4、Slab Allocator还有重复使用已分配内存的目的,分配的内存不会释放,而是重复利用。
5、Slab Allocator术语:
Page ?分配给Slab的内存空间,默认是1MB,分配给Slab之后跟据Slab大小切分成chunk。
Chunk ?用于缓存数据的内存空间。
Slab Class ?特定大小的chunk组。
?
Memcached根据收到数据的大小,选择最合适数据大小的Slab,Memcached内会保存slab内空闲chunk的列表。
?
四、Slab Allocator存在的问题:
由于分配的是特定长度的内存,因此无法有效利用分配的内存。
例如:将100字节的数据存入128字节的chunk,则浪费了28字节。
但如果预先知道客户端发送的数据的公用的大小,或者仅缓存大小相同的数据的情况下。只要使用适合数据大小的组的列表,就可以减少浪费。
?
五、调优:
启动时指定growth factor因子,就可以在某种程度上控制slab之间的差异,默认值为1.25。
Memcached f 2 vv
(查看growth factor为2时slab中chunk size的差异)
Memcached引入时,最好重新计算一下数据的预期平均长度,调整growth factor,以获得最恰当的设置。
?
六、连接Memcached?控制台:
telnet?主机名 端口号
如:telnet localhost 11211
输入stats回车,查看memcached的状态。
Memcached?软件包中Protocol.txt可以查看协议相关信息。
使用memcached-tool的Perl脚本,可以方便的获得slab的情况。
memcached-tool?主机:端口 选项
?
七、数据删除:
1、Memcached不会释放已分配的内存,其存储空间可以重复使用。
2、Lazy Expiration:
Memcached内部不会监视数据是否过期,而是在get时查看数据的时间戳,查看数据是否过期。被称为lazy expiration(惰性过期)。
3、当Memcached内存空间不足,即无法从slab class中获取到新的空间时,就从最近未被使用的数据中搜索,将其空间分配给新的数据。(如果要禁用LRU,使用-M参数,超出会报错)。
4、不指定具体值则默认数值为64M。
?
八、其它:
1、二进制协议:使用理由是不需要文本协议的解析处理,使得memcached性能更高。
2、分布式:将key保存在不同的服务器上。
3、性能可达到:请求最大15000qps,流量400Mbps,连接数超过10000个,性能非常高。
4、分布式hash算法:
(1)取模:
求得键整数的hash值,除以服务器台数,所得的余数决定服务器。
缺点:当添加或者移除服务器时,缓存重组的代价相当巨大,会影响缓存命中率。
(2)Consistent Hashing:
首先求出memcached节点的哈希值,并将其配置到0--2^32的圆上。然后用同样的方法求出存储数据的键的hash值,并映射到圆上。然后从存储数据映射的位置顺时针查找,将数据保存到找到的第一个服务器上。
Consistent Hashing最大程度的抑制了键的重新分布,只有从增加服务器地点到逆时针相邻第一台服务器之间的键会受到影响。
有的Consistent Hashing还采用了虚拟节点的思想,使用一般hash函数的话,服务器的映射地点分布非常不均匀。使用虚拟节点为每个服务器在环上分配100--200个点,这样能抑制分布不均匀,最大限度的减小服务器增减时缓存重新分布。
?