memcached 内存分配
启动 Memcached 时,-m指定内存大小,将信息保存到缓存中后才开始分配和保留物理内存。
通过 Slab allocation 机制对内存进行管理
内存分配
最大内存默认64,通过-m调整。
内存空间由slab classes构成,内存以slab page为单位去申请,分配到对应的slab class。
slab page :最大1兆,由1个或多个chunk组成
chunk:实际存储数据的单元
memcached 内存管理及设计
item
为键值数据的实际储存结构。item主要由公共属性、数据部分两个部分组成。
Chunk
由申请的连续内存块平均切分而成,用来存放Item数据,根据Item大小找到近似的Chunk。
Slab
管理特定大小的 chunk 的集合。Memcached每次默认分配的一个连续内存块为1M大小,它们被切分为不同大小
的chunk。
HashTable
Memcached的哈希表采用链接法实现。hashtable被分成多个桶bucket,哈希冲突,通过h_next指针形成bucket下链接的单向链表。
LUR
Memcached中每个slab中都维护了一个LRU链表,来组织该slab中已经被分配的item块,用于记录“最近最少使用”的item信息。
memcached缓存策略
在1.4.x及更早版本中,memcached中的LRU是标准的双向链表:有头部和尾部。将新物品插入头部,从尾部弹出驱逐物。
如果访问某个项目,则将其从其位置取消链接,然后重新链接到头部(此处称为“碰撞”),返回到LRU的顶部
下面这些情况,带有超时时间的记录会被删除
- 被人为删除
- 被set覆盖
- 被动删除:过期后,被get、add等命令访问
- 主动清除:LRU机制
Memcached缓存策略-- 分段LUR
分段LUR每个Slab-class安排一个LRU,每个LRU拆分为四个子LRU类型。
每个存储的数据都有两个标志位:FETCHED、ACTIVE
- FETCHED:该数据曾经被请求过
- ACTIVE: 该数据有两次或以上被请求,当数据被移动时移除。
- TEMP: 该队列中的 item TTL 通常只有几秒,不会被挪动。具体时间可配置 stats settings temporary_ttl选项
- HOT:试用队列,数据不会长久存在该链表,一旦数据到达队列的尾部,则开始移动。如果物品处于活动状态, 它将被移动到WARM,非活动状态,它将被移动到COLD。
- WARM: 访问量不大的数据如果物品处于活动状态, 它将被移动到warm头部,非活动状态,它将被移动到COLD。
- COLD:最不活跃的数据
回收时如果处于active状态,则移动到warm,否则删除。
memcached 缓存策略 LUR CRAWler
LRU爬虫是一个单独的后台线程专门用来处理失效的数据检查每个slab class中每个子LRU链表
网友评论