memcached-内存存储原理

内存分配原理

在内存中申请一个page页。再分割成固定大小的几个区(slab),每个区里再分割相同大小的块(chunk)。在使用memcached的添加缓存值时,它自动选择合适的chunk来储存信息大的value用大的chunk,小的value用小的chunk。同时slab的大小由 memcached能使用的内存和增长比例(growth factor,默认1.25)来决定。启动memcached时,分别可以使用-m 和- f参数来设定

注意:

1.Page分配给Slab的内存空间,默认是1MB
2.chunk的大小默认48B
3.Memcached分配出去的page不会被回收或者重新分配
4.Memcached申请的内存不会被释放
5.slab空闲的chunk不会借给任何其他slab使用(新版本memcached有slab_reassign,slab_automove的功能)


数据存储

获取待存储对象的大小,根据这个大小,从最小的Chunk Size开始查找,找到第一个(即最小的)能放下size大小的对象的Chunk.找不到(size大于最大的Chunk Size)返回0(这就是为什么slab class从1开始而不是从0开始)

如果某个Slab没有剩余的Chunk了,系统便会给这个Slab分配一个新的Page以供使用,如果没有Page可用,系统就会触发LRU机制,通过删除冷数据来为新数据腾出空间,这里有一点需要注意的是:LRU不是全局的,而是针对Slab而言的


产生内存碎片

内存碎片:空闲,但无法被利用的内存空间

产生原因:在多次申请/释放过程中,形成的零碎空间,没法利用

注:chunks为固定大小,造成浪费,不能完全解决,可以通过调整Growth Factor因子来缓解

1.slab中chunk size的大小等于前一个slab的chunk size乘以factor(增长因子
2.估算我们item的大小:key键长+suffix+value值长+结构大小(48字节)
3.逐步调整slab增长因子,使得某个slab的大小和我们的item大小接近(必须大于我们item的大小)

数据过期与删除

1.懒惰检查(Lazy Expiration)

memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过

期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。

2.LRU(Least recently used,最近最少使用)淘汰

memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不

足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。

因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空

间分配给新的记录。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值