關(guān)于前端面試中常提到的LRU緩存策略詳析
LRU
LRU(Least Recently Used)最近最少使用緩存策略,根據(jù)歷史數(shù)據(jù)記錄,當(dāng)數(shù)據(jù)超過了限定空間的時候?qū)?shù)據(jù)清理,清理的原則是對很久沒有使用到過的數(shù)據(jù)進(jìn)行清除。
一、為什么要使用Map是來定義容器
Map在保存數(shù)據(jù)時會按照記住存儲數(shù)據(jù)時候的順序,這樣存儲的數(shù)據(jù)是有序列的,并且會維護(hù)鍵值對的插入順序,Map存儲數(shù)據(jù)的鍵值可以是任意類型(對象或者基本類型都可),Map提供了get、set、delete方法十分方便;而Object
的話是無序,當(dāng)然也可以使用Array
。另外Map的算法復(fù)雜度是O(1),處理數(shù)據(jù)更迅速。
二、應(yīng)用場景
- redis
- 瀏覽器瀏覽記錄
- vue中內(nèi)置組件keep-alive
三、代碼實(shí)現(xiàn)
實(shí)現(xiàn)的大概思路如下:
- 創(chuàng)建一個LRUCache類
- 定義容器以及容器的容量
- 定義set方面,設(shè)置容器中的數(shù)據(jù)
- 定義get方法,獲取容器中的數(shù)據(jù)
class LRUCache { constructor(length) { // 定義容器容量 this.length = length; // 創(chuàng)建數(shù)據(jù)容器,生成一個空映射 this.map = new Map(); } // 設(shè)置key值 set(key, value) { } // 獲取key值 get(key) {} }
接下來就是對set方法和get方法的處理:
set
- 當(dāng)容器長度不超過設(shè)定的長度:設(shè)置key值,但是為了達(dá)到緩存策略的效果,需要我們先刪除數(shù)據(jù),后添加到容器的最后一條
- 當(dāng)容器長度超過設(shè)定的長度:先刪除掉容器中的第一條數(shù)據(jù)
get
- 先獲取數(shù)據(jù)值,然后刪除該條數(shù)據(jù),再設(shè)置數(shù)據(jù)到最后
class LRUCache { constructor(length) { // 定義容器容量 this.length = length; // 定義數(shù)據(jù)容器 this.map = new Map(); } // 設(shè)置key值 set(key, value) { // 如果容器容量超過設(shè)定的容量 if (this.map.size >= this.length) { // 等價(jià)于:let firstKey = this.map.keys()[0] //map.keys().next()查詢?nèi)萜髦械谝粭l數(shù)據(jù)的key值 //keys()會返回一個迭代器對象,包含了實(shí)力對象中的每一個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)建實(shí)例對象并設(shè)置容器大小 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ù)跑最后了。因?yàn)樵趃et時候先delete后set了。
console.log(lruCache.get('class'), 'lruCache')//xinguan
總結(jié)
到此這篇關(guān)于關(guān)于前端面試中常提到的LRU緩存策略的文章就介紹到這了,更多相關(guān)前端面試LRU緩存策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript獲取并更改input標(biāo)簽name屬性的方法
這篇文章主要介紹了JavaScript獲取并更改input標(biāo)簽name屬性的方法,涉及javascript針對表單元素屬性的相關(guān)操作技巧,需要的朋友可以參考下2015-07-07JavaScript Generator函數(shù)使用分析
生成器Generator是JavaScript ES6引入的特性,它讓我們可以分段執(zhí)行一個函數(shù)。但是在談?wù)撋善鳎℅enerator)之前,我們要先了解迭代器Iterator2022-10-10微信小程序?qū)崿F(xiàn)錨點(diǎn)跳轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)錨點(diǎn)跳轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11原生js實(shí)現(xiàn)點(diǎn)擊按鈕復(fù)制內(nèi)容到剪切板
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)點(diǎn)擊按鈕復(fù)制內(nèi)容到剪切板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11js面向?qū)ο笾o態(tài)方法和靜態(tài)屬性實(shí)例分析
這篇文章主要介紹了js面向?qū)ο笾o態(tài)方法和靜態(tài)屬性,實(shí)例分析了靜態(tài)方法和靜態(tài)屬性的原理及應(yīng)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01用JS實(shí)現(xiàn)網(wǎng)頁元素陰影效果的研究總結(jié)
用JS實(shí)現(xiàn)網(wǎng)頁元素陰影效果的研究總結(jié)...2007-08-08JavaScript獲取GridView選擇的行內(nèi)容
一般GridView第一列是多選框CheckBox,負(fù)責(zé)標(biāo)記當(dāng)前行是否被選中,后面可以有文本框TextBox,下拉框DropDownList,標(biāo)簽Lable2009-04-04