说明:以往阅读源码,总是想把每个文件、每行代码搞清楚,甚至不放过宏定义。个人认为这是“捡了芝麻,丢了西瓜”。阅读源代码,学习其设计方法和思想,了解设计思路是主要的;而不是通过阅读源代码学习语言用法,能学习固然好,但是在精力有限时,要把精力主要放在阅读代码的初衷上。
在阅读源码之前,先对Memcached的工作流程做了解,这样阅读起来事半功倍。
Memcached使用Libevent,以此为基础来处理事件。其原理为:启动时的线程为main thread,它包含一个event_base,之后创建多个work thread;每个work thread中也有一个event_base。main thread中的event_base负责监听网络,接收新连接;当建立连接后就把新连接交给work thread来处理。
Memcached是基于key-value来存储数据的。数据全部放在内存,因此重启后数据会全部消失。基于key-value存储,用的是map;确切说是hashmap,以内存来换取高效率。
Memcached有自己的内存管理机制。内存分配方面,使用了SLAB机制,避免了频繁使用malloc/free带来的内存碎片问题。SLAB机制在Linux也有用到,其原理为:先分配一个大的内存块,之后把这个大内存块分成更小的内存单元;当需要使用内存时,就去对应的单元去取,使用完后归还(不是释放)。这样就可以避免动态开始和释放内存造成内存碎片问题。可以参考https://en.wikipedia.org/wiki/Slab_allocation。
在Memcached中的实现为:先分配大小为1M的slab,然后在把这个1M的slab分割为更小的chunk,大小相同的chunk的组成一个集合(slab),当需要分配内存时,向上取整(增加大小,找到合适大小的chunk)找到对应的chunk,从这个chunk取走内存,使用完后归还给这个chunk。
使用LRU机制,淘汰长期不用的Item。LRU全称为Least Recently Used(最近最少使用),意思为将最近最少使用的Item释放,用来加载其他Item。
版权声明:本文为博主原创文章,未经博主允许不得转载。