memcached 使用 (下)

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








你可能感兴趣的:(JAVA)