LRU的问题
当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。
2Q Cache
2Q算法
2Q算法有两个缓存队列,一个是FIFO队列,用于保存最近访问的数据;一个是LRU队列,用于保存热点数据。
golang-lru实现
在golang-lru中,两个队列都是用simplelru实现。
type TwoQueueCache struct {
size int
recentSize int
recent simplelru.LRUCache
frequent simplelru.LRUCache
recentEvict simplelru.LRUCache
lock sync.RWMutex
}
其中recent 用于保存最近访问的数据,frequent用于保存热点数据,recentEvict保存从最近队列中剔除的数据。