Caffeine - Performance - Efficiency
效率
Least Recently Used 是一种流行的剔除策略,它简单且在通用场景下有良好的命中率。然而,在典型的工作负载中,LRU并不是最优的,并且在诸如全扫描的情况下命中率可能很差。以下各节对经过广泛评估的最佳替代(策略)进行了比较。为简洁起见,仅讨论执行时间复杂度为O(1)的前三个策略。这不包括基于时钟的策略,该策略以最坏情况下O(n)时间复杂度为代价,以便更易于并发实现。
Caffeine使用Window TinyLfu策略,因为它命中率高且内容占用量少。
自适应替换缓存(Adaptive Replacement Cache)
ARC 使用一个队列来(保存)查看一次的条目,一个队列来(保存)查看多次的条目,非常驻队列(保存)正在被监控的剔除条目。队列的最大大小根据工作负载模式和缓存的有效性进行动态调整。
该策略易于实施,但需要将缓存大小加倍才能保留剔除的key。它也已经获得专利,没有IBM的许可协议不得使用。
LIRS(Low Inter-reference Recency Set)
LIRS通过参照新近度(IRR)来组织块,并将条目分组为低参照新近度(LIR)和高参照新近度(HIR)。LIR最好保留在缓存中,剔除的HIR条目可以保留为非常驻HIR条目。这允许在缓存丢失后不久将非常住HIR条目提升为LIR条目。
该策略实施起来很复杂,并且仅当 缓存的大小增加到三倍以保留剔除key时 才能实现其最大效率。
Window TinyLfu
W-TinyLfu使用小型的准入LRU,如果(条目)被TinyLfu准入策略接受,则将其剔除到较大的分段LFU。TinyLfu依靠频率草图(frequency sketch) 来概率性的估计条目的历史使用情况。当条目显示新近爆发时,窗口将使该策略具有较高的命中率,否则将被拒绝。窗口与主空间的大小使用爬山优化算法进行自适应。此配置使缓存能够以较低的开销来估计条目的频率和新近度。
此实现使用4为CountMinSketch,以每个缓存条目为8字节的速度增长以确保准确性。与ARC和LIRS不同,此策略不保留剔除key。
模拟
将剔除策略与Bélády’s理论上限的最佳策略进行比较。描述了所有评估跟踪的子集以提供一系列工作负载。
Wikipedia
WikiBench提供了向Wikipedia发出的所有用户请求的10%的痕迹。
Glimpse
此跟踪由LIRS算法的作者提供,并具有循环访问模式。
Database
此跟踪由ARC算法的作者提供,并被描述为“在商业站点上运行的数据库服务器,该服务器在商业数据库之上运行ERP应用程序。”
Search
该跟踪由ARC算法的作者提供,并被描述为“大型商业搜索引擎响应各种Web搜索请求而发起的磁盘读取访问”。
OLTP
此跟踪由ARC算法的作者提供,并且“在一个小时内包含对CODASYL数据库的引用”。
Adaptivity (自适应性)
该工作负载在新近度偏斜的轨迹(Corda)和频率偏斜的轨迹(5x Lirs’loop)之间转换。 这表明W-TinyLfu具有重新配置自身的能力。
结论
Window TinyLfu提供接近最佳的命中率,并且与ARC和LIRS竞争。 它在保持简单的同时做到了这一点,不需要非常驻条目,并且占用的内存少。 该策略对各种工作负载的LRU进行了实质性改进,使其成为通用缓存的不错选择。