面试题答案
一键面试设计思路
- 结合FIFO与LRU:FIFO 简单且对内存回收效率高,能快速释放长时间未清理的缓存;LRU 基于最近最少使用原则,能保留热点数据。将两者结合,在保证内存高效利用的同时,尽量缓存热点数据。
- 分层设计:设计一个两层缓存结构,第一层使用 FIFO 策略作为快速淘汰层,主要用于快速处理大量短期数据,第二层使用 LRU 策略,用于缓存热点数据。
数据结构
- FIFO 层:使用队列(Queue)数据结构,新数据从队尾插入,当缓存满时,从队头删除数据。
- LRU 层:使用双向链表(Doubly Linked List)和哈希表(Hash Table)结合的数据结构。双向链表用于记录数据的访问顺序,哈希表用于快速定位数据在链表中的位置。
操作流程
- 读操作:
- 首先在 LRU 层查找数据,如果找到,将其移到链表头部(表示最近被访问),并返回数据。
- 如果 LRU 层未找到,在 FIFO 层查找。若找到,将数据从 FIFO 队列中移除,插入到 LRU 层链表头部,并返回数据。
- 若两层都未找到,则返回未命中。
- 写操作:
- 先检查 LRU 层是否已满,如果未满,直接将新数据插入到 LRU 层链表头部。
- 如果 LRU 层已满,将链表尾部(最近最少使用)的数据移除,插入到 FIFO 队列队尾,然后将新数据插入到 LRU 层链表头部。
- 如果 FIFO 层也已满,从 FIFO 队列队头删除数据,再将新数据插入到 FIFO 队列队尾。
自适应调整
- 负载变化:
- 当系统负载较低时,可适当减少 FIFO 层的缓存容量,增加 LRU 层的容量,因为此时系统有更多资源缓存热点数据。
- 当系统负载较高时,增加 FIFO 层的缓存容量,以快速处理大量短期数据,减轻 LRU 层的压力。
- 数据访问模式改变:
- 可以通过统计数据访问频率来监测访问模式。如果发现热点数据的生命周期变长,即热点数据在一段时间内持续被频繁访问,适当增加 LRU 层的容量。
- 如果发现大量短期数据的涌入,增加 FIFO 层的容量,以更好地处理这类数据。同时,可以定期调整两层缓存的容量比例,以适应数据访问模式的动态变化。