Memcached技术知识深刻学习笔记

1、Memcached特色:算法

一、协议简单(基于文本行的协议)。缓存

二、基于libevent的事件处理。服务器

三、内置内存存储方式。分布式

四、Memcached不相互通讯的分布式。ide

注:因为数据保存在内置的内存存储空间中,因此重启memcached会致使所有数据消失。内容容量达到指定值以后,就基于LRU算法自动删除不使用的缓存。Memcached服务器端没有分布式功能,这彻底取决于客户端的实现。memcached

2、启动参数:函数

-p 使用端口,默认11211性能

-m 最大内存大小,默认64Mspa

-vv very verbose模式启动,调试信息和错误输出到控制台。操作系统

-d 做为daemon在后台启动。

3、Memcached的内存管理机制:

1、默认采用名为Slab Allocator的分配、管理内存机制。

2、该机制出现前,内存的分配是经过对全部记录简单的进行mallocfree来进行的。这种方式会致使内存碎片,加剧操做系统内存管理器的负担。

3Slab Allocator基本原理:按照预先规定的大小,将分配的内存分割成各类特定长度的块,并把尺寸相同的块分红组(chunk的集合),以彻底解决内存碎片的问题。

4Slab Allocator还有重复使用已分配内存的目的,分配的内存不会释放,而是重复利用。

5Slab Allocator术语:

Page – 分配给Slab的内存空间,默认是1MB,分配给Slab以后跟据Slab大小切分红chunk

Chunk – 用于缓存数据的内存空间。

Slab Class – 特定大小的chunk组。

Memcached根据收到数据的大小,选择最合适数据大小的SlabMemcached内会保存slab内空闲chunk的列表。

4、Slab Allocator存在的问题:

因为分配的是特定长度的内存,所以没法有效利用分配的内存。

例如:将100字节的数据存入128字节的chunk,则浪费了28字节。

但若是预先知道客户端发送的数据的公用的大小,或者仅缓存大小相同的数据的状况下。只要使用适合数据大小的组的列表,就能够减小浪费。

5、调优:

启动时指定growth factor因子,就能够在某种程度上控制slab之间的差别,默认值为1.25

Memcached –f 2 –vv

(查看growth factor2slabchunk size的差别)

Memcached引入时,最好从新计算一下数据的预期平均长度,调整growth factor,以得到最恰当的设置。

6、链接Memcached 控制台:

telnet 主机名端口号

如:telnet localhost 11211

输入stats回车,查看memcached的状态。

Memcached 软件包中Protocol.txt能够查看协议相关信息。

使用memcached-toolPerl脚本,能够方便的得到slab的状况。

memcached-tool 主机:端口选项

7、数据删除:

1Memcached不会释放已分配的内存,其存储空间能够重复使用。

2Lazy Expiration

Memcached内部不会监视数据是否过时,而是在get时查看数据的时间戳,查看数据是否过时。被称为lazy expiration(惰性过时)

3、当Memcached内存空间不足,即没法从slab class中获取到新的空间时,就从最近未被使用的数据中搜索,将其空间分配给新的数据。(若是要禁用LRU,使用-M参数,超出会报错)。

4、不指定具体值则默认数值为64M

8、其它:

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个点,这样能抑制分布不均匀,最大限度的减少服务器增减时缓存从新分布。

相关文章
相关标签/搜索