1. Map結(jié)構(gòu)實(shí)現(xiàn)
//最新加入的和最近被訪問(wèn)的將放入迭代器最后面
let LRUCache = function (capacity) {
this.cache = new Map();
this.capacity = capacity;//緩存容量
};
LRUCache.prototype.get = function (key) {
if (this.cache.has(key)) {
//已存在,則刪除舊鍵值對(duì),新增新鍵值對(duì)锐帜,目的是將當(dāng)前鍵值對(duì)后移,保持新鮮
let temp = this.cache.get(key);
this.cache.delete(key);
this.cache.set(key, temp);
return temp;
}
return undefined;//倉(cāng)庫(kù)中沒(méi)有時(shí)的返回值
};
LRUCache.prototype.put = function (key, value) {
if (this.cache.has(key)) {
//已存在畜号,則刪除舊鍵值對(duì)
this.cache.delete(key);
} else if (this.cache.size >= this.capacity) {
// 不存在缴阎,則判定當(dāng)前容器是否已滿(mǎn)
// 已滿(mǎn)則刪除最上面的價(jià)值的(最不新鮮的)
this.cache.delete(this.cache.keys().next().value);
}
//新增新鍵值對(duì),保持新鮮
this.cache.set(key, value);
};
- Map結(jié)構(gòu)可以記住當(dāng)前鍵值對(duì)的插入順序简软,用來(lái)記錄數(shù)據(jù)的新鮮度
- 不用像數(shù)組一樣需要遍歷蛮拔,時(shí)間復(fù)雜度O(1)
- 每次都是刪除舊鍵值對(duì)述暂,新增鍵值對(duì),保證新鮮度
- 若超過(guò)容器容量上限建炫,則刪除迭代器最上面的鍵值對(duì)(最不新鮮)畦韭,再新增
2. 使用場(chǎng)景
- 緩存(keep-alive、自定義Promise緩存)