memcached 使用 (下)

本文介绍了Memcached如何通过slab allocator机制管理内存,避免内存碎片化,并解释了内存分配及回收策略,包括chunk的固定大小分配导致的内存浪费、过期数据的惰性删除以及LRU算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

memcached 使用 (下)


内存的碎片化
如果用 c 语言直接 malloc,free 来向操作系统申请和释放内存时 , 在不断的申请和释放过程中 , 形成了一些很小的内存片断 , 无法再利用 . 这种空闲 , 但无法利用内存的现象 ,--- 称为内存的碎片化 .
slab allocator 缓解内存碎片化
memcached slab allocator 机制来管理内存 .
slab allocator 原理 : 预告把内存划分成数个 slab class 仓库 .( 每个 slab class 大小 1M) 各仓库 , 切分成不同尺寸的小块 (chunk). 需要存内容时 , 判断内容的大小 , 为其选取合理的仓库
系统如何选择合适的 chunk?

memcached 根据收到的数据的大小 , 选择最适合数据大小的 chunk (slab class) (图 3.3 )。 memcached 中保存着 slab class 内空闲 chunk 的列表 , 根据该列表选择空的 chunk, 然后将数据缓存于其中。 

固定大小 chunk 带来的内存浪费
由于 slab allocator 机制中 , 分配的 chunk 的大小是 固定 , 因此 , 对于特定的 item, 可能造成内存空间的浪费 .
比如 , 100 字节的数据缓存到 122 字节的 chunk , 剩余的 22 字节就浪费了
对于 chunk 空间的浪费问题 , 无法彻底解决 , 只能缓解该问题 .
开发者可以对网站中缓存中的 item 的长度进行统计 , 并制定合理的 slab class 中的 chunk 的大小 .
可惜的是 , 我们目前还不能自定义 chunk 的大小 , 但可以通过参数来调整各 slab class chunk 大小的增长速度 . 即增长因子 , grow factor! 

memcached 的过期数据惰性删除
1: 当某个值过期后 , 并没有从内存删除 , 因此 ,stats 统计时 , curr_item 有其信息 2: 当某个新值去占用他的位置时 , 当成空 chunk 来占用 .
3: get 值时 , 判断是否过期 , 如果过期 , 返回空 , 并且清空 , curr_item 就减少了 .
-- 这个过期 , 只是让用户看不到这个数据而已 , 并没有在过期的瞬间立即从内存删除 . 这个称为 lazy expiration, 惰性失效 .
好处 --- 节省了 cpu 时间和检测的成本 

memcached 此处用的 lru 删除机制 .
如果以 122byte 大小的 chunk 举例 , 122 chunk 都满了 , 又有新的值 ( 长度为 120) 要加入 , 要挤掉谁 ?
memcached 此处用的 lru 删除机制 .
( 操作系统的内存管理 , 常用 fifo,lru 删除 )
lru: least recently used 最近最少使用 fifo: first in ,first out
原理 : 当某个单元被请求时 , 维护一个计数器 , 通过计数器来判断最近谁最少被使用 . 就把谁 t

: 即使某个 key 是设置的永久有效期 , 也一样会被踢出来 ! -- 永久数据被踢现象 

https://github.com/GHBghb/MemcachedDemo








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值