java實(shí)現(xiàn)LRU緩存淘汰算法的方法
LRU算法:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最長(zhǎng)時(shí)間沒有被使用的緩存(即使該緩存被訪問的次數(shù)最多)。
如何實(shí)現(xiàn)LRU緩存淘汰算法
場(chǎng)景:
我們現(xiàn)在有這么個(gè)真實(shí)場(chǎng)景,我在爬取某個(gè)網(wǎng)站時(shí),控制該網(wǎng)站的代理IP并發(fā)數(shù),太多會(huì)搞垮對(duì)方網(wǎng)站的對(duì)吧,要蹲號(hào)子的呢。這里我需要維護(hù)一個(gè)代理IP代理池,而且這些IP肯定不是一直都很穩(wěn)定的,但是又不能取一個(gè)就丟一個(gè),這樣太浪費(fèi)資源。所以我會(huì)將這些IP緩存起來,進(jìn)行按需提取,采用LRU最近最少使用的策略去管理代理IP。
代碼如下:
import java.util.*;
public class LRUCache {
int cap;//最大緩存的數(shù)量
Map<String, String> values;//緩存
Set<String> position;//緩存的key,按照存入的順序存儲(chǔ)
public LRUCache(int cap) {
this.cap = cap;
values = new HashMap<>(cap);
position = new LinkedHashSet<>(cap);
}
/**
* 從緩存中獲取值,緩存中沒有則返回null
*/
public String get(String key) {
String value = null;
if (values.containsKey(key)) {
value = values.get(key);
position.remove(key);
position.add(key);
}
return value;
}
/**
* 將值放入緩存中
*/
public void put(String key, String value) {
if (position.size() == cap) {
//若達(dá)到緩存上限則將距今最久的緩存刪除
String firstKey = position.iterator().next();
position.remove(firstKey);
values.remove(firstKey);
}
position.add(key);
values.put(key, value);
}
public Map<String, String> getValues() {
return values;
}
public Set<String> getPosition() {
return position;
}
}
測(cè)試:
LRUCache lruCache = new LRUCache(4);
lruCache.put("a","a");
lruCache.put("b","b");
lruCache.put("c","c");
lruCache.put("d","d");
System.out.println("position:"+lruCache.getPosition());
System.out.println("values:"+lruCache.getValues());
//a將被淘汰
lruCache.put("e","e");
System.out.println("position:"+lruCache.getPosition());
System.out.println("values:"+lruCache.getValues());
輸出:
position:[a, b, c, d]
values:{a=a, b=b, c=c, d=d}
position:[b, c, d, e]
values:{b=b, c=c, d=d, e=e}
到此這篇關(guān)于java實(shí)現(xiàn)LRU緩存淘汰算法的方法的文章就介紹到這了,更多相關(guān)java LRU緩存淘汰算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java使用MulticastSocket實(shí)現(xiàn)組播
這篇文章主要為大家詳細(xì)介紹了java使用MulticastSocket實(shí)現(xiàn)組播,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
java 中cookie的詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了java 中cookie的詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,這里對(duì)cookie 的建立與讀取,和設(shè)定cookie 生命周期等詳細(xì)介紹,需要的朋友可以參考下2017-01-01
java實(shí)現(xiàn)XML增加元素操作簡(jiǎn)單示例
這篇文章主要介紹了java實(shí)現(xiàn)XML增加元素操作,結(jié)合簡(jiǎn)單實(shí)例形式分析了java針對(duì)xml格式數(shù)據(jù)的讀取、遍歷、創(chuàng)建等操作技巧,需要的朋友可以參考下2017-02-02
elasticsearch索引index之Mapping實(shí)現(xiàn)關(guān)系結(jié)構(gòu)示例
這篇文章主要介紹了elasticsearch索引index之Mapping實(shí)現(xiàn)關(guān)系結(jié)構(gòu)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
java復(fù)制文件的4種方式及拷貝文件到另一個(gè)目錄下的實(shí)例代碼
這篇文章主要介紹了java復(fù)制文件的4種方式,通過實(shí)例帶給大家介紹了java 拷貝文件到另一個(gè)目錄下的方法,需要的朋友可以參考下2018-06-06
Java使用agent實(shí)現(xiàn)main方法之前的實(shí)例詳解
這篇文章主要介紹了Java使用agent實(shí)現(xiàn)main方法之前的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下2017-10-10
Java搭建簡(jiǎn)單Netty開發(fā)環(huán)境入門教程
這篇文章主要介紹了Java搭建簡(jiǎn)單Netty開發(fā)環(huán)境入門教程,有詳細(xì)的代碼展示和maven依賴,能夠幫助你快速上手Netty開發(fā)框架,需要的朋友可以參考下2021-06-06
JAVA通過HttpURLConnection 上傳和下載文件的方法
這篇文章主要介紹了JAVA通過HttpURLConnection 上傳和下載文件的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09
詳解@Autowired(required=false)注入注意的問題
這篇文章主要介紹了@Autowired(required=false)注入注意的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

