写点什么

Memcached 缓存

  • 2021 年 11 月 11 日
  • 本文字数:1188 字

    阅读完需:约 4 分钟

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 会


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


再次产生一个 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 模式的原子操作,可以低成本的解决并发控制问题

缺点

无法容灾、持久化。

评论

发布
暂无评论
Memcached缓存