一个缓存组件是否好用,其中一个重要的指标就是他的缓存命中率,而命中率又和缓存组件自己的缓存数据淘汰算法息息相关。
FIFO(First in First out)先进先出。能够理解为是一种相似队列的算法实现。
LRU(The Least Recently Used)最近最久未使用算法。相比于FIFO算法智能些。
缺点:对于周期性、偶发性的访问数据,有大几率可能形成缓存污染,也就是置换出去了热点数据,把这些偶发性数据留下了,从而致使LRU的数据命中率急剧降低。
下图展现了LRU简单的工做过程,访问时对数据的提早操做,以及数据满且添加新数据的时候淘汰的过程的展现以下:
此处介绍的LRU是有明显的缺点,如上所述,对于偶发性、周期性的数据没有良好的抵抗力,很容易就形成缓存的污染,影响命中率,所以衍生出了不少的LRU算法的变种,用以处理这种偶发冷数据突增的场景,好比:LRU-K、Two Queues等,目的就是当判别数据为偶发或周期的冷数据时,不会存入空间内,从而下降热数据的淘汰率。
下图展现了LRU-K的简单工做过程,简单理解,LRU中的K是指数据被访问K次,传统LRU与此对比则能够认为传统LRU是LRU-1。能够看到LRU-K有两个队列,新来的元素先进入到历史访问队列中,该队列用于记录元素的访问次数,采用的淘汰策略是LRU或者FIFO,当历史队列中的元素访问次数达到K的时候,才会进入缓存队列。
下图展现了Two Queues的工做过程,与LRU-K相比,他也一样是两个队列,不一样之处在于,他的队列一个是缓存队列,一个是FIFO队列,当新元素进来的时候,首先进入FIFO队列,当该队列中的元素被访问的时候,会进入LRU队列,过程以下:
LFU(The Least Frequently Used)最近不多使用算法,与LRU的区别在于LRU是以时间衡量,LFU是以时间段内的次数
下面描述了LFU的简单工做过程,首先是访问元素增长元素的访问次数,从而提升元素在队列中的位置,下降淘汰优先级,后面是插入新元素的时候,由于队列已经满了,因此优先淘汰在必定时间间隔内访问频率最低的元素。
W-TinyLFU(Window Tiny Least Frequently Used)是对LFU的的优化和增强。
关于Count-Min Sketch算法,能够看做是布隆过滤器的同源的算法,假如咱们用一个hashmap来存储每一个元素的访问次数,那这个量级是比较大的,而且hash冲突的时候须要作必定处理,不然数据会产生很大的偏差,Count-Min Sketch算法将一个hash操做,扩增为多个hash,这样原来hash冲突的几率就下降了几个等级,且当多个hash取得数据的时候,取最低值,也就是Count Min的含义所在。
下图展现了Count-Min Sketch算法简单的工做原理: