Memcached 缓存
memcached 仅支持基础的 key-value 键值对类型数据存储
在 memcached 内存结构中有两个非常重要的概念:slab 和 chunk
slab 是一个内存块,是memcached一次申请内存的最小单位
在启动 memcached 的时候一般会使用参数-m 指定其可用内存,但并非在启动的那一刻所有的内存就全部分配,只有在需要的时候才会去申请,而且每次申请一定是一个 slab
slab 的大小固定为 1M,一个slab由若干个大小相等的chunk组成
每个 chunk 中都保存了一个 item 结构体、一对 key/value
虽然在同一个 slab 中 chunk 的大小相等的,但是在不同的slab中chunk的大小并不一定相等
在 memcached 中按照 chunk 的大小不同,可以把 slab 分为很多种类(class),默认情况下 memcached 把 slab 分为 40 类(class1~class40),在 class 1 中,chunk 的大小为 80 字节,由于一个 slab 的大小是固定的 1M,因此在 class1 中最多可以有 13107 个 chunk(也就是这个 slab 能存最多 13107 个小于 80 字节的 key-value 数据)
memcached内存管理采取预分配、分组管理
分组管理就是我们上面提到的 slab class,按照 chunk 的大小 slab 被分为很多种类
内存预分配过程是怎样的呢?
向 memcached 添加一个 item 时候,memcached 首先会根据item的大小,来选择最合适的slab class
计算好所要放入的 chunk 之后,memcached 会去检查该类大小的 chunk 还有没有空闲
如果没有,将会申请 1M(1 个 slab)的空间并划分为该种类 chunk
例如我们第一次向 memcached 中放入一个 190 字节的 item 时,memcached 会产生一个 slab class 2(也叫一个 page),并会用去一个 chunk,剩余 5241 个 chunk 供下次有适合大小 item 时使用,当我们用完这所有的 5242 个 chunk 之后,下次再有一个在 160~200 字节之间的 item 添加进来时,memcached 会
再次产生一个 class 5 的 slab(这样就存在了 2 个 pages)
总结来看,memcached 内存管理需要注意
chunk 是在 page 里面划分的,page 固定为 1m,所以 chunk 最大不能超过 1m
chunk 实际占用内存要加 48B,因为 chunk 数据结构本身需要占用 48B
如果用户数据大于 1m,则 memcached 会将其切割,放到多个 chunk 内
已分配出去的 page 不能回收
**对于 key/value 信息,最好不要超过 1m 的大小
同时信息长度最好相对是比较均衡稳定的,这样能够保障最大限度的使用内存
同时,memcached 采用的 LRU 清理策略,合理甚至过期时间,提高命中率**
无特殊场景下,key-value 能满足需求的前提下,使用 memcached 分布式集群是较好的选择,搭建与操作使用都比较简单
分布式集群在单点故障时,只影响小部分数据异常,目前还可以通过 Magent 缓存代理模式,做单点备份,提升高可用
整个缓存都是基于内存的,因此响应时间是很快,不需要额外的序列化、反序列化的程序,但同时由于基于内存,数据没有持久化,集群故障重启数据无法恢复
高版本的 memcached 已经支持 CAS 模式的原子操作,可以低成本的解决并发控制问题
缺点
无法容灾、持久化。
评论