?? 個人主頁:不叫貓先生
???♂? 作者簡介:2022年度博客之星前端領域TOP 2,前端領域優(yōu)質作者、阿里云專家博主,專注于前端各領域技術,共同學習共同進步,一起加油呀!
??優(yōu)質專欄:vue3從入門到精通、TypeScript從入門到實踐
?? 資料領取:前端進階資料以及文中源碼可以找我免費領取
?? 前端學習交流:博主建立了一個前端交流群,匯集了各路大神,一起交流學習,期待你的加入!(文末有我wx或者私信)
LRU
LRU(Least Recently Used)最近最少使用緩存策略,根據(jù)歷史數(shù)據(jù)記錄,當數(shù)據(jù)超過了限定空間的時候對數(shù)據(jù)清理,清理的原則是對很久沒有使用到過的數(shù)據(jù)進行清除。
一、為什么要使用Map是來定義容器
Map在保存數(shù)據(jù)時會按照記住存儲數(shù)據(jù)時候的順序,這樣存儲的數(shù)據(jù)是有序列的,并且會維護鍵值對的插入順序,Map存儲數(shù)據(jù)的鍵值可以是任意類型(對象或者基本類型都可),Map提供了get、set、delete方法十分方便;而Object
的話是無序,當然也可以使用Array
。另外Map的算法復雜度是O(1),處理數(shù)據(jù)更迅速。
二、應用場景
- redis
- 瀏覽器瀏覽記錄
- vue中內置組件keep-alive
三、代碼實現(xiàn)
實現(xiàn)的大概思路如下:
- 創(chuàng)建一個LRUCache類
- 定義容器以及容器的容量
- 定義set方面,設置容器中的數(shù)據(jù)
- 定義get方法,獲取容器中的數(shù)據(jù)
class LRUCache {
constructor(length) {
// 定義容器容量
this.length = length;
// 創(chuàng)建數(shù)據(jù)容器,生成一個空映射
this.map = new Map();
}
// 設置key值
set(key, value) {
}
// 獲取key值
get(key) {}
}
接下來就是對set方法和get方法的處理:
-
set
- 當容器長度不超過設定的長度:設置key值,但是為了達到緩存策略的效果,需要我們先刪除數(shù)據(jù),后添加到容器的最后一條
- 當容器長度超過設定的長度:先刪除掉容器中的第一條數(shù)據(jù)
-
get
- 先獲取數(shù)據(jù)值,然后刪除該條數(shù)據(jù),再設置數(shù)據(jù)到最后
class LRUCache {
constructor(length) {
// 定義容器容量
this.length = length;
// 定義數(shù)據(jù)容器
this.map = new Map();
}
// 設置key值
set(key, value) {
// 如果容器容量超過設定的容量
if (this.map.size >= this.length) {
// 等價于:let firstKey = this.map.keys()[0]
//map.keys().next()查詢容器中第一條數(shù)據(jù)的key值
//keys()會返回一個迭代器對象,包含了實力對象中的每一個key值
let firstKey = this.map.keys().next().value;
//刪除容器中第一條數(shù)據(jù)
this.map.delete(firstKey);
}
// 容器中存在key就先刪除掉
if (this.map.has(key)) {
this.map.delete(key);
}
// 刪除后重新加入該條數(shù)據(jù)
this.map.set(key, value);
}
// 獲取key值
get(key) {
// 獲取key值不存在返回null
if (!this.map.has(key)) {
return null;
}
// 獲取key值
let value = this.map.get(key);
//刪除容器中的該條數(shù)據(jù)
this.map.delete(key);
//重新把該條數(shù)據(jù)添加到容器中
this.map.set(key, value);
return value
}
}
// 創(chuàng)建實例對象并設置容器大小
const lruCache = new LRUCache(5)
添加6條數(shù)據(jù)
lruCache.set('name', 'zhangsan')
lruCache.set('class', 'xinguan')
lruCache.set('age', 19)
lruCache.set('sex', '男')
lruCache.set('occupation', '前端工程師')
lruCache.set('year', '2023')
console.log(lruCache, 'lruCache')
對lruCache添加了6條數(shù)據(jù)并按順序排列,打印出來只剩5條數(shù)據(jù),添加的第一條(‘name’, ‘zhangsan’)被刪除了。
然后獲取class的值,發(fā)現(xiàn)key為class的這條數(shù)據(jù)跑最后了。因為在get時候先delete后set了。文章來源:http://www.zghlxwxcb.cn/news/detail-793928.html
console.log(lruCache.get('class'), 'lruCache')//xinguan
文章來源地址http://www.zghlxwxcb.cn/news/detail-793928.html
到了這里,關于前端面試中經(jīng)常提到的LRU緩存策略詳解的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!