Memcached是一套高性能的分布式内存对象缓存系统,用于在动态系统中减小数据库负载,提高性能。html
基于libevent的事件处理算法
内置内存存储方式SLab Allocation机制数据库
并不单一的数据删除机制缓存
基于客户端的分布式系统服务器
Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有如下几个亮点:事件驱动( event-driven),高性能;轻量级,专一于网络,不如 ACE 那么臃肿庞大;源代码至关精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。网络
以上引自百度百科,在不支持I/O多路复用的状况下,一个线程同时只能处理一个socket文件操做符,因此当一个任务未完成时,线程须要等待任务的处理,这种处理模型效率低下。而I/O多路复用无需等待任务完成,而是将全部任务维护在一个I/O组中,在等待过程当中线程能够去处理其余的任务,当某个任务完成后,再去操做该socket操做符。值得一提的是,在I/O多路复用技术中,epoll是很是棒的,相比于select模型,epoll没有文件操做符数量的限制;而且select模型是将全部操做符维护在一个I/O组中,当有socket数据可操做时,线程须要在组中寻找哪一个文件操做符可操做,而epoll只将可操做的socket文件操做符给线程,线程无需本身寻找,能够直接操做该socket,提升了处理性能。socket
因此,使用libevent时间处理模型,很是好的提高了memcached的性能。分布式
在memcached中,内存不是直接C语言提供的malloc()
free()
进行管理的,由于原生的内存管理方式会形成内存碎片,会加剧内存管理器的内存管理负担。而SLab Allocation机制完美的解决了内存碎片化的问题。memcached
SLab Allocator 在初始化时,经过将内存分配成预先设置的大小,将这些内存分割成特定长度的块(chunk),并把尺寸相同的chunk分红一个组,也就是chunk集合,而这种方式就解决了内存碎片化的问题。性能
在须要存储缓存数据时,memcached会在chunk中选择与所存数据大小最接近的chunk,并将数据存储到该chunk中,这样不须要每次在存储数据时,都向操做系统申请空间,提高了memcached的处理性能。
当存储的数据过时后,memcached不会释放该数据的所占用的内存,而仅仅是将该数据标记为不可用,当有新数据须要存储时,memcached会将数据从新存储到该空间中,用这种方式对内存进行重复利用。
由于Slab Allocator将内存分割成固定大小的块,当存储的数据小于chunk的长度,会致使该chunk剩余空间的浪费。例如:当一个数据占用60K,而最接近的chunk长度为64K,此时就有4K的空间形成浪费。而目前仅有的调优方案是调整Growth Factor因子,让chunk的大小尽量的接近,减小空间的浪费。
当存储在memcached中的记录过时时,memcached不会释放该内存,而是让客户端对该记录不可见。留下内存来,让以后的存储记录进行内存重复利用。
memcached为了提高性能,在内部不会对存储在memcached中的记录进行监视,而是在每次get数据的时候,对该记录的过时时间进行校验,当记录过时,则不返回数据。
虽然memcached拥有内存重复利用的机制,可是进行大量数据缓存时,仍是会出现内存吃满,memcached没法在SLab中获取到空闲的内存,在这种状况下,memcached会触发LRU,会在最近未被使用的记录中进行搜索,并将这些空间分配给新的记录。
不一样于其余软件的分布式,memcached的分布式不存在于服务端,而是彻底由客户端进行分布式的处理。这样的好处是,减小memcached服务端之间的网络链接,当某一个服务器宕机时,不至于影响其余机器的正常使用。
经过crc32()
计算出键的整数哈希值,而后除以服务器的台数,求得余数进行服务器节点的选择,此种方式的优势是,简单易操做,而且数据的分散性也很是优秀。但缺点是,当改变服务器的数量时,缓存重组的代价巨大,在此过程当中缓存的命中率急剧降低。
首先求出memcached服务器节点的哈希值,并将其分配到一个0~2^32的圆上,咱们称该这个圆为值域,以后经过一样的计算方式求出键的哈希值,并将值映射到圆上,而后从数据映射到的位置开始顺时针寻找,并将数据存储到找到的第一个服务器节点上,若是找到2^32仍然找不到就将数据存储到第一台memcached机器上。
当添加一台新机器时,经过一样的hash算法将该机器映射到圆上,影响的仅仅是新机器的节点到它的上一个节点之间的数据。
当删除一台机器时,一样也仅仅影响映射到删除的机器和它的上一台机器之间的数据,而不会形成大面积的缓存重组即rehash.
备注:资源和图片等均来自网络
原文做者:我才是二亮
原文连接:http://blog.2liang.me/2016/11/28/learn-memcached-principle/转载请在正文中标注并保留原文连接、做者等信息。