memcached的存储原理
memcached也许有的人会因为它小而没有去关注它,也许有的人会因为它简便而熟知它。
它的原理不是很复杂,我们都知道它是将数据放入到内存里面,而内存的分配无非就是预分配内存和动态分配内存。预分配内存其实就是提前分配好一些固定大小的内存块,然后数据来了就选择一块适当的内存块放入,这种方式很明显会有一些内存碎片,会造成内存的浪费。而动态内存分配,其实就是塞入一个数据,然后当场给它分配一块大小合适的内存块,但是这种方案显然会比较慢,耗费一定的时间。每种方案都有利有弊,memcached用的就是预分配-方案,就是想空间换时间。在讲这个之前,我先来讲讲几个关键词, 1: slab 2: chunk。首先slab是每次申请内存的小单位,意思就是每次申请一个内存块,至少是一个slab,默认是1M,间接的说明,一个key/value大就是1M,超过了就存储不小,我们在启动memcached的时候,都会指定大小,但是虽然是预分配,但是不会一次性全部分配出去,只是预分配一部分slab出去。2: chunk是存储数据的地方,大小有很多,小的是80byte。了解了这两个概念,那么整个存储原理也差不多了。哦对了,还有一个概念忘记说了,就是我们的slab是分很多种类的,每种slab里面都是大小相同的chunk。好了,接下来我就给大家把整个贯穿起来说说,首先申请一个slab内存块,然后切割成大小相同的chunk,组成一个slab种类,因为不同的slab之间是由不同的chunk组成,所以,每个slab可存储的大小也是不一样,当数据塞过来后,会根据大小选择适当的slab种类,然后看下slab中是否有空闲的chunk,如果有就塞入数据,若空闲空间不足,那么就会向系统申请一个新的slab内存块,因为slab内存块只要申请了,即使数据过期了,也不会释放slab,只有重启的时候才会释放,所以如果遇到没有slab可以申请的话,就会淘汰以前旧的slab,采用的依然是LRU算法,是不是听起来很熟悉。说到这,差不多整个的存储原理也说完了。
结尾说点啥了,竟然词穷了。一个这么爱叨叨的一个人,竟然不知道怎么和大家说拜拜了。好吧,先这样吧。下次再分享点其他的。东西比较简单。
来源 https://www.modb.pro/db/191205
相关文章