8.Memcached的工作原理

8.Memcached的工作原理

 

8.1 Memcached概述

 

Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统memcached 虽然没有像redis所具备的数据持久化功能,比如RDBAOF都没有,但是可以通过做集群同步的方式,让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并提供服务。

 

Memcached 借助了操作系统的 libevent 工具做高效的读写。libevent是个程序库,它将LinuxepollBSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在LinuxBSDSolaris等操作系统上发挥其高性能

 

Memcached 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached 最适合保存用户的session实现session共享

 

Memcached存储数据时, Memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page

 

Memcached 支持多种开发语言,包括:JAVA,C,Python,PHP,C#,Ruby,Perl

 

 

8.2 Memcached工作原理

 

8.2.1 内存分配机制

 

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

 

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

 

Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个SlabSlab分配之后内存按照固定字节大小等分成chunk

 

Chunk:用于缓存记录k/v值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk128bytes64bytes等多种,假如数据只有100bytes,则只能存储在大小为128bytes的chunk中,存在少许浪费。Chunk最大就是Page的大小,即一个Page中就一个Chunk

 

Slab ClassSlab按照Chunk的大小分组,就组成不同的Slab Class, 第一个Chunk大小为 96BSlabClass1,Chunk 120BClass 2,如果有100bytes要存,那么Memcached会选择下图中Slab Class 2 存储,因为它是120bytesChunkSlab之间的差异可以使用Growth Factor 控制,默认1.25

 

范例:查看Slab Class

[root@centos8 ~]#memcached -u memcached -f 2 -vv

slab class   1: chunk size        96 perslab   10922

slab class   2: chunk size       192 perslab    5461

slab class   3: chunk size       384 perslab    2730

slab class   4: chunk size       768 perslab    1365

slab class   5: chunk size      1536 perslab     682

slab class   6: chunk size      3072 perslab     341

slab class   7: chunk size      6144 perslab     170

slab class   8: chunk size     12288 perslab      85

slab class   9: chunk size     24576 perslab      42

slab class  10: chunk size     49152 perslab      21

slab class  11: chunk size     98304 perslab      10

slab class  12: chunk size    196608 perslab       5

slab class  13: chunk size    524288 perslab       2

<27 server listening (auto-negotiate)

<28 server listening (auto-negotiate)

 

 

8.2.2 懒过期 Lazy Expiration

 

memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。

 

 

8.2.3 LRU

 

当内存不足时,memcached会使用LRULeast Recently Used)机制来查找可用空间,分配给新记录使用。

 

 

 

8.2.4 集群

 

Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。

 

posted @   惊起千层浪  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示