缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。常见的策略有三种:
- 先进先出策略 FIFO(First In, First Out);
- 最少使用策略 LFU(Least Frequently Used);
- 最近最少使用策略 LRU(Least Recently Used);
五花八门的链表结构
相比数组,链表(Linked List)是一种稍微复杂一点的数据结构。我们先从底层的存储结构上来看一看,为了直观地对比,我画了一张图:
从图中我们看到,数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败;而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。

