LFU(Least Frequently Used)即最近最不經常使用.從名字上來分析,這是一個基於訪問頻率的算法.與LRU不一樣,LRU是基於時間的,會將時間上最不常訪問的數據淘汰;LFU爲將頻率上最不常訪問的數據淘汰.既然是基於頻率的,就須要有存儲每一個數據訪問的次數.從存儲空間上,較LRU會多出一些持有計數的空間.java
那麼LFU算法的主導思想是什麼呢?LFU算法認爲"若是數據過去訪問頻率很高,那麼未來被訪問的頻率也很高".好吧,我知道這又是個僞命題,不過全部的可實現的淘汰算法,都是基於對過去數據認識來推斷將來的發展,這跟天氣預報是一個思路(固然,天氣預報要複雜的多).未來的事情哪能說的準,根據過去的狀況來推斷未來.好了,不羅嗦了.算法
下面簡單講解一下:緩存
固然,這只是一個簡單的模型圖,實現方式不少,也能夠不須要緩存池從新排序.數據結構
【命中率】性能
命中率比LRU較高,可以避免週期性或偶發性的狀況對LRU的命中影響,可是,一旦訪問內容發生較大變化,LFU須要用更長的時間來適應(歷史的頻率記錄會是這些污染數據保持較長的一段時間)spa
【複雜度】.net
須要維護全部的訪問記錄的頻率數據結構,實現較LRU複雜.blog
【存儲成本】排序
須要維護全部的訪問記錄的頻率數據結構.內存
【缺陷】
僅僅從最近訪問頻率上考慮淘汰算法,可能會淘汰一些仍有價值的單元.內存和性能消耗較高.
暫時略,之後會採用僞代碼和java語言的方式作簡單的實現.
最後,若有哪裏不正確的地方,請多多指教. 後續會將其餘緩存淘汰算法一一介紹,敬請期待.
相關文章: