'緩存置換算法 - LRU算法'

算法 Redis 數據庫 Java Java虛擬機 歷史 CSDN 程序員小皮 2019-09-14
"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

2.3 鏈表+HashTable實現

解決自己維護鏈表,插入、查詢慢的問題,可以使用鏈表+HashTable來實現LRU算法,代碼如下所示:

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

2.3 鏈表+HashTable實現

解決自己維護鏈表,插入、查詢慢的問題,可以使用鏈表+HashTable來實現LRU算法,代碼如下所示:

緩存置換算法 - LRU算法

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

2.3 鏈表+HashTable實現

解決自己維護鏈表,插入、查詢慢的問題,可以使用鏈表+HashTable來實現LRU算法,代碼如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

2.3 鏈表+HashTable實現

解決自己維護鏈表,插入、查詢慢的問題,可以使用鏈表+HashTable來實現LRU算法,代碼如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

2.3 鏈表+HashTable實現

解決自己維護鏈表,插入、查詢慢的問題,可以使用鏈表+HashTable來實現LRU算法,代碼如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

LRU算法的演變

LRU-K算法

LRU算法的弊端是會產生“緩存汙染”,比如週期性訪問的數據。為了解決這個問題,我們引入LRU-K算法。舉個例子,需要查詢的數據特別頻繁,我們從redis或者數據庫中拉取數據比較慢可以放在jvm緩存中,如下圖所示:

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

2.3 鏈表+HashTable實現

解決自己維護鏈表,插入、查詢慢的問題,可以使用鏈表+HashTable來實現LRU算法,代碼如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

LRU算法的演變

LRU-K算法

LRU算法的弊端是會產生“緩存汙染”,比如週期性訪問的數據。為了解決這個問題,我們引入LRU-K算法。舉個例子,需要查詢的數據特別頻繁,我們從redis或者數據庫中拉取數據比較慢可以放在jvm緩存中,如下圖所示:

緩存置換算法 - LRU算法

滿足條件的數據放在LRU隊列中,應用程序第一次拉取數據從LRU隊列中來拿,如果沒有再從歷史隊列中拿,如果還拿不到就從redis中拿,並把拿到的數據放入歷史隊列中,歷史隊列的數據滿足一定條件就放入LRU隊列中


作者:生命—在繼續

原文:CSDN

"

LRU算法

1 原理

對於在內存中並且不被使用的數據塊就是LRU,這類數據需要從內存中刪除,以騰出空間來存儲常用的數據。

LRU算法(Least Recently Used,最近最少使用),是內存管理的一種頁面置換算法,就是用來刪除內存中不被使用的數據,騰出空間來把常用的數據存進去。

LRU算法的實現原理:把所有的緩存數據存入鏈表中,新插入的或被訪問的數據存入鏈表頭,如果鏈表滿了,就把尾部的數據清除。如下圖所示:

緩存置換算法 - LRU算法

比如長度是5,緩存中的數據是:1,2,3,4,5

訪問了2,那麼緩存中的數據順序變為:2,1,3,4,5

新插入了6,會變為:6,2,1,3,4

2 Java編碼實現

2.1 基於linkedhashmap實現

linkedhashmap的底層實現是鏈表,使用linkedhashmap實現LRU算法的關鍵在於設置鏈表的長度,代碼如下所示:

緩存置換算法 - LRU算法

2.2 鏈表實現

可以自己維護一個鏈表,來實現LRU算法,但是這種方式的弊端是查詢、插入的效率比較慢,代碼實現如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

2.3 鏈表+HashTable實現

解決自己維護鏈表,插入、查詢慢的問題,可以使用鏈表+HashTable來實現LRU算法,代碼如下所示:

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

緩存置換算法 - LRU算法

LRU算法的演變

LRU-K算法

LRU算法的弊端是會產生“緩存汙染”,比如週期性訪問的數據。為了解決這個問題,我們引入LRU-K算法。舉個例子,需要查詢的數據特別頻繁,我們從redis或者數據庫中拉取數據比較慢可以放在jvm緩存中,如下圖所示:

緩存置換算法 - LRU算法

滿足條件的數據放在LRU隊列中,應用程序第一次拉取數據從LRU隊列中來拿,如果沒有再從歷史隊列中拿,如果還拿不到就從redis中拿,並把拿到的數據放入歷史隊列中,歷史隊列的數據滿足一定條件就放入LRU隊列中


作者:生命—在繼續

原文:CSDN

緩存置換算法 - LRU算法

"

相關推薦

推薦中...