计算机科学中只有两件难事:缓存失效和命名。-- Phil Karlton
缓存驱逐是从缓存中删除数据,以便在缓存容量达到极限时为新条目腾出空间的过程。这有时会由缓存失效触发,即从缓存中删除不再被视为有效或新鲜的数据。
下图显示了最常见的缓存驱逐策略。
1.LRU(最近最少使用)
LRU 驱逐策略首先删除最近访问次数最少的项目。这种方法的原理是,最近访问过的项目在不久的将来更有可能再次被访问。LRU 可以通过哈希表和双链表的组合来实现。
2.MRU(最近使用)
与 LRU 相反,MRU 算法首先删除最近使用的项目。在最近访问的项目不太可能很快再次被访问的情况下,这种策略非常有用。不过,由于 MRU 采用了与直觉相反的缓存管理方法,因此并不常用。
3.SLRU(分段式 LRU)
SLRU 将高速缓存分为两段:缓存段和保护段。新项目最初被放入试用段。如果缓存段中的项目再次被访问,它就会被提升到保护段。从缓存段的 LRU 端开始驱逐,保护段中的项目会被赋予更高的优先级,以留在缓存中。这种方法旨在将 LRU 的优势与保护频繁访问项目的附加层结合起来。
4.LFU(最不常用算法)
LFU 算法会驱逐访问频率最低的项目。与考虑访问时间的 LRU 不同,LFU 侧重于项目被访问的次数,因此更有利于长期重复访问的项目。LFU 的实现可能比较复杂,因为它需要跟踪访问次数,并有可能动态调整整个缓存。
5.FIFO(先进先出)
FIFO 是最简单的缓存策略之一,缓存以类似队列的方式运行,先驱逐最旧的项目,而不管其访问模式或频率如何。虽然 FIFO 容易实现,但它并不考虑项目的实际使用情况,因此可能导致缓存性能不理想。
6.TTL(生存时间)
TTL 并非严格意义上的驱逐算法,它是一种为每个缓存项设定特定生命周期的策略。当 TTL 过期时,该项目将被视为过时项目,并在下次访问缓存时被自动删除或标记为符合驱逐条件。TTL 可与其他驱逐策略结合使用,以管理缓存的新鲜度。
7.双层缓存
在双层缓存策略中,第一层使用内存缓存,第二层使用分布式缓存。第一层通常保存经常使用的数据。
8.RR(随机替换)
随机替换算法随机选择一个缓存项并将其驱逐,为新项目腾出空间。这种方法实施起来也很简单,不需要跟踪访问模式或频率。不过,它的简单性也带来了代价,那就是可能纯属偶然地移除使用率高的项目。