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的,可以说是区域性的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值