(转载)Memcached基础知识


原文: https://www.cnblogs.com/xinhuaxuan/p/6087387.html

Memcached 基本的工作原理

Memcached 是以守护进程的方式运行于一个或者多个服务器中,随时等待客户端的连接请求,通过启动 Memcached 服务器端,配置相应的监听 IP、端口 等等,客户端可铜鼓 指定的服务器 IP 将数据以 key-value 的方式存储到 Memcached 实例中。

如下图所示,有 N 个 Memcached 示例部署在一台专门的机器上,应用程序在查询数据时首先去 Memcached 里面查询,如果有数据则直接返回客户端使用,如果 Memcached 里面没有需要的数据或者数据过期了,则应用程序先去查询数据库,然后把查询的结果放到 Memcached 实例里面去,最后返回给客户端。

在这里插入图片描述

Memcached 的两阶段哈希

第一阶段哈希是计算 “key-value ”存储在哪个 Memcached 实例上,第二阶段哈希是计算 “key-value”是存储在 Memcached实例的哪个chunk 里面。

客户端存取数据时,首先参考 Memcached 实例列表计算出 key 哈希值(阶段一哈希),进而险种一个 Memcached 实例;客户端将请求发送给选中的 Memcached 实例节点,然后该 Memcached 节点通过内部的哈希算法(阶段二哈希)进行真正的数据(item)存取。Memcached 的服务器和客户端并不使用复杂的XML 等格式,而是使用简单的基于文本行的协议。

如下图所示:

比如我们要在 Memcached 上存储 key 为 “Hello”,value 为“World” 的这么一个键值对。

阶段一哈希:首先是在客户端根据 key 计算出该“键值对”会存储在哪个Memcached实例中,假如是 m2

阶段二哈希:在Memcached 实例2 中再次根据 key 计算出 该 “键值对”在m2实例中存在的位置。

在这里插入图片描述

Memcached 的数据存储方式

Memcached 的数据存储方式被称为 Slab Allocation,其基本方式是:

  • 先把内存分成很多个 Slab,这个大小是预先规定好的,以解决内存碎片的问题。
  • 分配给Slab 的内存被称为 Page ,默认是 1M。一个 Slab 下可以有多个Page。
  • (如下图:在Memcached 实例中先把内存分了 n 个slab,然后每个 slab 里面分了 n 个 page)

在这里插入图片描述

  • 然后把一个 Page 分成很多个 chunk 块,chunk 块是用于缓存记录的空间。Chunk 的大小是现有一个基本值,然后根据增长因子来增大。
  • Slab Allocation 的原理——将分配的内存分割成各种尺寸的块(chunk),并把尺寸先沟通的块分成组(chunk的集合),每个 chunk 集合被称为 slab。
    (借用网上一张图来说明:)

在这里插入图片描述

  • slab class:内存区类别(48byte-1M),每个类别有一个 slab class Id

在这里插入图片描述

  • Memcached 里面保存着 slab 内存空间的 chunk 列表,当收到要保存时,它会根据 item 的大小去选择一个最适合的 slalb,就然后找到 空闲的chunk,把数据存放进去。

Memcached 新建 Item 分配内存过程

  • 第一步:
    快速定位 slab classid,先计算item 长度,key 键长 + flag + suffix(16字节)+ value值长 + 结构大小(32字节),比如计算出来有 90 byte,如果item 长度计算出来 > 1M,则无法存储丢弃,去最小冗余的 slab class 进行存储,比如:48、96、120,存储90 就会选96

  • 第二步
    按顺序寻找可用的chunk:
    (a)slot:检查slab 回收空间 slot 里是否有剩余 chunk;delete:delete 时标记到 slot;exptime:get 时检查的过期对象标记到slot;
    (b)end_page_ptr:检查page 中是否有剩余 chunk
    (c)momory:内存还有剩余空间可以用于开辟新的slab
    (d)LRU

(PS:Memcached的数据存储方式的缺点,由于 chunk的大小哦是预先分配好的特定长度,因此如果数据不能完全填满chunk,那么chunk 中剩余的空间就浪费了)

Memcached 的数据过期方式

  • Lazy Expiration(延迟、惰性 过期)
    Memcached不会监控记录是否过期,而是当客户端来获取数据的时候,才会检查记录的时间戳,因此成为 Lazy Expiration

  • LRU(Least Recently Used 最近最少使用)
    当空间不足的时候,Memcached 会优先使用已经过期的数据空间,如果还不够的话,那么就会把最近最少使用的对象的空间释放出来。(PS:要特别注意,Memcached 的 LRU 不是全局的,而是针对 slab 的,可以说是区域性的)

  • 惰性删除机制
    删除 item 对象时,不释放内存,做删除标记,指针放入slot 祸首插槽,下次分配的时候直接使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值