Memcache内存机制与LRU

本文介绍了Memcache的内存分配机制,包括页(page)、块(chunk)和项(item)的概念,以及如何使用LRU算法进行数据管理。还讨论了如何优化内存使用,避免大对象和调整增长因子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

memcache的内存分配机制:

memcache进程会预先分配一部分内存给slab,给slab分配的内存也叫page(page的默认大小是1M),每个page下面会有若干个chunk(chunk默认大小96B),而数据就会封装成item存储在chunk里面,若干个大小相同的chunk称为slab class,相同大小的chunk未必在一个slab中。所以在默认情况下一个slab存放的chunk数量为10922个chunk:10922×96+ 64 = 1048576(1M) 。

但是在一个slab中所有的chunk的大小是不同的,不同大小的chunk存放不同大小的数据。


memcache的数据删除机制:

当数据过期时,memcache并不会直接从内存中删除数据,因为memcache并不会回收已经分配的内存,而只是在get数据时检查时间戳是否过期,如果过期那么客户端就不可见,但是原来分配的内存可以重复使用,这叫做惰性失效。所以memcache不会对过期的数据进行监视,因此也就节省了cpu的资源。

但是在memcache中使用LRU机制进行删除数据,即最近最少使用。通过计数器来记录哪些数据最少被使用来删除它,所以也有可能删除一些尚未过期或者永久有效的数据。

在每个slab中数据都是存放在链表上的,链表有head和tail指针,分别指向最老和最新的数据。当LRU机制启动时,两个指针同时发挥作用查询失效数据,如果没有失效数据那么就会删除最近的最少被使用的数据。

LRU只针对每个slab,并不针对整体。只有在slab不能分配新的page内存时才会调用LRU。


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

1,避免大对象

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

2,调整增长因子

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值