面试题答案
一键面试缓存淘汰算法
- LRU(Least Recently Used):选择最近最少使用的数据进行淘汰。它基于一个假设,即如果数据在最近一段时间内没有被访问,那么在未来一段时间内被访问的可能性也较小。实现LRU可以使用双向链表和哈希表。双向链表用于维护数据的访问顺序,哈希表用于快速定位数据在链表中的位置。
- LFU(Least Frequently Used):淘汰使用频率最低的数据。通过记录每个数据的访问次数,在需要淘汰数据时,选择访问次数最少的进行淘汰。实现LFU可以使用哈希表记录数据的访问频率,同时使用优先队列(最小堆)来快速找到频率最低的数据。
内存分配策略
- 固定大小块分配:将内存划分成固定大小的块,每个缓存对象分配一个或多个这样的块。这种方式可以减少内存碎片,因为块的大小是固定的,分配和释放相对简单。例如,对于一些大小相近的缓存数据,可以都分配相同大小的块。
- 伙伴系统:将内存空间按照2的幂次方大小进行划分。当需要分配内存时,从合适大小的块中分配;当释放内存时,检查相邻的块是否为伙伴(大小相同且地址相邻),如果是则合并成更大的块。这种策略能有效减少内存碎片,提高内存利用率。
避免频繁缓存失效策略
- 设置合理的缓存过期时间:根据数据的访问模式和更新频率,设置不同的过期时间。对于经常更新的数据,设置较短的过期时间;对于相对稳定的数据,设置较长的过期时间。同时,可以采用随机化过期时间的方式,避免大量缓存同时过期,导致缓存雪崩。
- 缓存预热:在系统启动时,预先加载一些常用的数据到缓存中,避免在高并发情况下,由于缓存未命中导致大量请求直接访问后端数据源,进而引发缓存失效的连锁反应。
- 多级缓存:采用多级缓存结构,如一级缓存(靠近应用,如本地缓存)和二级缓存(如分布式缓存)。一级缓存可以处理大部分高频访问,减少对二级缓存的压力。当一级缓存失效时,再从二级缓存获取数据,从而降低缓存失效对系统性能的影响。