java 最少使用(lru)置换算法_缓存置换算法 - LRU算法
LRU算法
1 原理
對于在內(nèi)存中并且不被使用的數(shù)據(jù)塊就是LRU,這類數(shù)據(jù)需要從內(nèi)存中刪除,以騰出空間來存儲常用的數(shù)據(jù)。
LRU算法(Least Recently Used,最近最少使用),是內(nèi)存管理的一種頁面置換算法,就是用來刪除內(nèi)存中不被使用的數(shù)據(jù),騰出空間來把常用的數(shù)據(jù)存進去。
LRU算法的實現(xiàn)原理:把所有的緩存數(shù)據(jù)存入鏈表中,新插入的或被訪問的數(shù)據(jù)存入鏈表頭,如果鏈表滿了,就把尾部的數(shù)據(jù)清除。如下圖所示:
比如長度是5,緩存中的數(shù)據(jù)是:1,2,3,4,5
訪問了2,那么緩存中的數(shù)據(jù)順序變?yōu)?#xff1a;2,1,3,4,5
新插入了6,會變?yōu)?#xff1a;6,2,1,3,4
2 Java編碼實現(xiàn)
2.1 基于linkedhashmap實現(xiàn)
linkedhashmap的底層實現(xiàn)是鏈表,使用linkedhashmap實現(xiàn)LRU算法的關鍵在于設置鏈表的長度,代碼如下所示:
2.2 鏈表實現(xiàn)
可以自己維護一個鏈表,來實現(xiàn)LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現(xiàn)如下所示:
2.3 鏈表+HashTable實現(xiàn)
解決自己維護鏈表,插入、查詢慢的問題,可以使用鏈表+HashTable來實現(xiàn)LRU算法,代碼如下所示:
LRU算法的演變
LRU-K算法
LRU算法的弊端是會產(chǎn)生“緩存污染”,比如周期性訪問的數(shù)據(jù)。為了解決這個問題,我們引入LRU-K算法。舉個例子,需要查詢的數(shù)據(jù)特別頻繁,我們從redis或者數(shù)據(jù)庫中拉取數(shù)據(jù)比較慢可以放在jvm緩存中,如下圖所示:
滿足條件的數(shù)據(jù)放在LRU隊列中,應用程序第一次拉取數(shù)據(jù)從LRU隊列中來拿,如果沒有再從歷史隊列中拿,如果還拿不到就從redis中拿,并把拿到的數(shù)據(jù)放入歷史隊列中,歷史隊列的數(shù)據(jù)滿足一定條件就放入LRU隊列中
作者:生命—在繼續(xù)
原文:CSDN
總結
以上是生活随笔為你收集整理的java 最少使用(lru)置换算法_缓存置换算法 - LRU算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c #include如何找到文件_如何用
- 下一篇: qml中使用combobox实现多级菜单