SIEVE:比LRU更快更简单的新缓存算法


新的名为SIEVE的缓存淘汰算法,简单而高效。点击标题

SIEVE使用一个队列和一个指针来确定缓存中的哪些数据保留,哪些数据丢弃。它通过访问位来追踪数据的访问状态,并根据访问情况进行淘汰。

SIEVE在效率和简单性方面都表现出色,可以提高缓存的吞吐量和可扩展性。

此外,SIEVE还可以作为设计更高级缓存淘汰策略的基础。然而,SIEVE在处理扫描型工作负载时不够高效,在某些特定工作负载下不具备扫描抵抗性,需要使用幽灵缓存来提高性能。但它作为缓存基本算法,可以为设计更高级的缓存淘汰算法提供支持。

背景
保持缓存驱逐算法简单非常重要。复杂的算法有时会让人头疼。例如,当失误率很高时,调试和分析可能会很棘手。此外,复杂性意味着需要CPU 周期来做出决策。

另一方面,更简单的驱逐方法通常可以很好地提供良好的可预测性和吞吐量。例如,Apache流量服务器使用FIFO,MemC3使用 CLOCK ,而Segcache使用 FIFO-Merge 逐出算法。值得注意的是,虽然这些方法在吞吐量方面表现出色,但在缓存效率方面却有所妥协。

设计
数据结构: SIEVE只需要一个队列和一个称为“手”的指针。队列维护对象之间的插入顺序。队列中的每个对象使用一位来跟踪已访问/未访问状态。指针指向缓存中的下一个逐出候选者,并从尾部移动到头部。

SIEVE 操作:

  • 缓存命中会将访问对象的访问位改为 1。SIEVE 无需对访问位已被设置的热门对象执行任何操作。
  • 在缓存未命中期间,SIEVE 会检查指针指向的对象。如果该对象已被访问,则访问位被重置,指针移动到下一个位置(被保留的对象保留在队列的原始位置)。
  • 这个过程一直持续到遇到一个已访问位为 0 的对象并将其驱逐为止。
  • 驱逐后,指针指向下一个位置(队列中的前一个对象)。
  • 虽然被驱逐的对象大部分时间都在队列的中间位置,但新对象总是会被插入队列的头部。