Memcached的数据存储方式

一,理解Memcached的数据存储方式被称为Slab Allocator,其基本方式是:

    1,先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题。分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page。

    2,然后把一个Page分成很多个chunk块,chunk块是用于缓存记录的空间。chunk的大小是先有一个基本值,然后根据增长因子(1.25)来增大。

    3,slab class : 内存区类别(48byte-1M) , 每个类别有一个slab classId

    4,  Memcached 里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它会根据item的大小去选择一个最合适的slab,然后找到空闲的chunk,把数据放进去。

二,新建Item分配内存的过程

    1,快速定位slab classId , 先计算Item的长度

        key键长 + flag + suffix (17字节) + value值长 + 结构大小(32字节)  取最小冗余的 slab class

    2,按顺序寻找可用的chunk

        (1)slot:检查slab回收空间slot里是否有剩余的chunk

                delete:delete时标记到slot

                exptime: get时检查的过期对象标记到slot

        (2)end page ptr:检查page中是否有剩余的chunk

        (3)memory:内存还有剩余则开辟新的slab

        (4)LRU

三,memcached的数据存储方式的缺点:

    由于chunk的大小时预先分配好的特定长度,因此如果数据不能完全填满chunk,那么剩余的空间就浪费了

 

四,理解Memcached的数据过期方式:

    (1)Lazy Expiration(延迟/惰性 过期)

    Memcached不会监控记录是否过期,而是在外部来获取数据的时候,才检查记录时间戳。因此被称为Lazy Expiration

    (2)LRU(Least Recently Used )  

      当空间不足的时候,Memcached会优先使用已经过期的数据空间,如果还不够,那么就会把最近最少使用的对象的空间释放出来。 不是全局的,而是针对slab,可以说是区域性的。

    (3)懒惰删除机制

        删除item对象时,不释放内存,做删除标记,指针放入slot回收插槽,下次分配的时候直接使用。

要特别注意:Memcached的LRU不是全局的,而是针对slab的,可以说是区域性的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章