Memcached之你真正理解LRU吗(4)

众所周知,Memcached使用的是LRU(Least Recently Used最近最少使用)算法来回收缓存,将那些属于LRU的数据移出内存,从而腾出空间来加载另外的数据。那么Memcached的最近最少使用算法是怎么实现的呢?也许很多人都会回答:不就是在内存满了的情况下,把最近最少使用的Key替换掉,然后插入新的Key-Value键值对吗?其实不然,下面我们来深入的分析Memcached的LRU的内部实现,在分析LRU之前,让我们先了解一下Memcached的内部原理。

Memcached的内存分配

Memcached是采用Slab Allocator机制分配、管理内存,首先,我们必须理解三个概念:

Slab     相同Chunk大小的集合,一个Slab包含多个Page,一个Page(默认是1M)包含多个Chunk,Chunk就是最终存放数据的地方。
Page   Page默认是1M,一个Page包含多个Chunk。
Chunk     默认情况下Chunk的大小是:96,随着指定的增长因子变化(参数 -f <factor>)

Slab Allocator机制是将分配给Memcached的内存,切分成若干个Slab,每个Slab下的Page的大小默认是1M,也就是说,如果一个Slab占用了50M的内存的话,在默认的情况下就有50个Page。在Memcached启动的时候是没有活动的Slab的,在插入数据的时候,如果Chunk不够用才会申请Slab,一旦分配了内存就不会释放,重复利用。

具体如图所示:

Memcached缓存原理

Memcached根据收到的数据的大小,选择最适合数据大小的Slab(如下图)。 Memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

Memcached的内存浪费:

将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了(如下图):

了解了上面的一些Memcached基础概念之后,我们接下来说一下Memcached LRU的原理。

Memcache LRU:

首先我们要知道:

1,Memcached的LRU算法针对每个Slab执行,而不是针对整体。

2,数据只会存在指定的Slab中,即使该Slab已经满了,而且更大的Slab有空间,这种情况也会执行LRU算法,因为数据也不会被存放到更大的Slab中。

一个Slab会有多个Page,一个page默认是1M,启动Memcached会预分配1M,当1M的数据满之后,如果有新数据进来,那么会重新分配一个Page给这个slab,但是Memcached是有内存上限的,如果不能申请Page的话,这时候就要针对这个Slab再利用LRU算法剔除掉最近最少使用的数据了。

一种有效缓解使用LRU的方法是:

1,避免大对象

如果系统上只有及个别几个大对象的话,会浪费内存空间,因为Slab申请了Page是不能释放内存的,及个别大对象会导致Slab申请了内存资源而得不到充分的利用。

2,调整增长因子

根据项目的需求调整增长因子,使内存充分利用。

总而言之,言而总之,就是让内存充分利用。避免Slab中的Chunk虚位以待。

参考文档:

http://blog.charlee.li/memcached-001/

http://blog.charlee.li/memcached-002/

http://blog.charlee.li/memcached-003/

http://blog.charlee.li/memcached-004/

http://blog.charlee.li/memcached-005/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 02:59:49

Memcached之你真正理解LRU吗(4)的相关文章

memcached全面剖析–2. 理解memcached的内存存储

Slab Allocation机制:整理内存以便重复使用 最近的memcached默认情况下采用了名为Slab Allocator的机制分配.管理内存. 在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的. 但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下, 会导致操作系统比memcached进程本身还慢.Slab Allocator就是为解决该问题而诞生的. 下面来看看Slab Allocator的原理.下面是memcached文档中的

Memcached之缓存雪崩,缓存穿透,缓存预热,缓存算法(7)

缓存雪崩 缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 解决思路: 1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力.这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量. 2,分析用户行为,尽量让失效时间点均匀分布.避免缓存雪崩的出现. 3,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏

Memcached之缓存雪崩,缓存穿透,缓存预热,缓存算法

缓存雪崩 缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 解决思路: 1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力.这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量. 2,分析用户行为,尽量让失效时间点均匀分布.避免缓存雪崩的出现. 3,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:Redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏

【转】Memcached之缓存雪崩,缓存穿透,缓存预热,缓存算法

缓存雪崩 缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 解决思路: 1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力.这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量. 2,分析用户行为,尽量让失效时间点均匀分布.避免缓存雪崩的出现. 3,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏

缓存雪崩,缓存穿透解决方案(转载)

http://www.cnblogs.com/jinjiangongzuoshi/archive/2016/03/03/5240280.htmlcc 1. 缓存穿透:查询一个必然不存在的数据.比如文章表,查询一个不存在的id,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成影响. 解决办法:对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃. 2.缓存失效:如果缓存集中在一段时间内失效,DB的压力凸显.这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分

缓存穿透,缓存击穿,缓存雪崩解决方案分析

本文转自:http://blog.csdn.net/zeb_perfect/article/details/54135506 前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义.在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞

memcached源码分析-----LRU队列与item结构体

转载请注明出处:http://blog.csdn.net/luotuo44/article/details/42869325 LRU队列: 之前的<slab内存分配>博文已经说到一个slab class里面的所有slab分配器都只分配相同大小的item,不同的slab class分配不同大小的item.item结构体里面有一个slabs_clsid成员,用来指明自己是属于哪个slab class的.这里把slabs_clsid值相同的item称为是同一类item. slab分配器负责分配一个i

深入理解memcached

网上有5篇介绍memcached的文章,写的挺好,这里转过来. memcached完全剖析–1. memcached的基础 memcached全面剖析–2.理解memcached的内存存储 memcached全面剖析–3.memcached的删除机制和发展方向 memcached全面剖析–4. memcached的分布式算法 memcached全面剖析–5. memcached的应用和兼容程序

memcached完全剖析–1. memcached的基础

系列文章导航: memcached完全剖析–1. memcached的基础 memcached全面剖析–2. 理解memcached的内存存储 memcached全面剖析–3. memcached的删除机制和发展方向 memcached全面剖析–4. memcached的分布式算法 memcached全面剖析–5. memcached的应用和兼容程序 翻译一篇技术评论社的文章,是讲memcached的连载.fcicq同学说这个东西很有用,希望大家喜欢. 发表日:2008/7/2 作者:长野雅广(