简述memcached的工作原理

1.内内存分配机制

应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。

Memcached采用了Slab Allocator机制来分配、管理内存。

  • Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成chunk。(1G可以分配成1024个page),因此最大存储1M。
  • Chunk:用于缓存记录k/v值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费。不同的page分配不同的chunk,不同的规格,
    • Chunk最大就是Page的大小,即一个Page中就一个Chunk
  • Slab Class:Slab按照Chunk的大小分组,就组成不同的Slab Class, 第一个Chunk大小为 96B的Slab为Class1,Chunk 120B为Class 2,如果有100bytes要存,那么Memcached会选择下图中SlabClass 2 存储,因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默认1.25。 (最小slab为96B)

image-20220715134511674

2.懒过期 Lazy Expiration

memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。因此省资源,不需要CPU额外的进行清理运行。

3.LRU

当内存不足时,memcached会使用LRU(Least Recently Used)机制来查找可用空间,最近不使用的直接被覆盖新数据,分配给新记录使用。只要访问使用,就会自动提升时间位置,不会被清理。

4.集群

Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群

Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。

5.总结

memcached启动会在内存中分布一块大的空间*(默认64M,可以修改)供memcached使用,存内容的时候,以键值对的形式存储,数据有大有小,不规范,容易形成内存碎片(每次存放数据大小不一样,一定时间清理,清理之后的腾出的空间不连续,有大有小,导致总空间大小能容纳某个数据,实际并不能存放),为了提升内存使用效率,memcached把内存空间先分成page,1page大小1M,进而把page分为大小不同的格子(chunk),每个page采用不同的划分规则,形成格子(chunk)空间大小不等的分组(Slab class),数据存放的时候,根据数据的大小放到不同的分组(slab class)对应的格子(格子的内存略大于数据的大小),这样清理之后的空间能够重复使用,就不存在碎片。提升了内存的使用效率,同时memcachd不会主动删除数据,当长时间不访问,最终的空间就会被新的数据覆盖,memcached会根据数据访问的时间程度进行覆盖新数据,长时间不访问的会被覆盖,最近访问的不会被覆盖,memcached的自身不具有高可用,需要借助客户端,第三方工具实现高可用集群。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值