面试之 Memcache 相关

Memcache的存储原理和lru机制?

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.调整增长因子

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

Memache和memcached的区别?

  • memcached 支持 Binary Protocol,而 memcache 不支持,意味着 memcached 会有更高的性能。
  • 不过,还需要注意的是,memcached 目前还不支持长连接。
  • memcached 比 memcache 支持更多的 memcache 协议,大概也就是说 memcached 有更多的方法,比如 getMulti() 和 setMulti() 函数非常有用,但是 memcache 并不支持。

Memcache内存满了怎么办?

存到硬盘,操作系统都有虚拟内存,当内存满了,都会存到虚拟内存里而虚拟内存是存放在硬盘上,所以MEMCACHE满了会存到硬盘要么就增加内存空间,要么将一些临时用的数据操作完之后,立即销毁,避免占内存。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

redis 的lru机制也类似吗?

5年前 评论

“一个 slab 中所有的 chunk 的大小是不同的” ,你从哪里得到的资料这么说? 请不要误导

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!