偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一文帶你了解什么是 LRU 算法?

開發(fā) 前端
LRU (Least recently used:最近最少使用)算法在緩存寫滿的時(shí)候,會(huì)根據(jù)所有數(shù)據(jù)的訪問記錄,淘汰掉未來被訪問幾率最低的數(shù)據(jù)。也就是說該算法認(rèn)為,最近被訪問過的數(shù)據(jù),在將來被訪問的幾率最大。

緩存 是我們寫代碼過程中常用的一種手段,是一種空間換時(shí)間的做法。就拿我們經(jīng)常使用的 HTTP 協(xié)議,其中也存在強(qiáng)緩存和協(xié)商緩存兩種緩存方式。當(dāng)我們打開一個(gè)網(wǎng)站的時(shí)候,瀏覽器會(huì)查詢該請求的響應(yīng)頭,通過判斷響應(yīng)頭中是否有 Cache-Control、Last-Modified、ETag 等字段,來確定是否直接使用之前下載的資源緩存,而不是重新從服務(wù)器進(jìn)行下載。

下面就是當(dāng)我們訪問百度時(shí),某些資源命中了協(xié)商緩存,服務(wù)端返回 304 狀態(tài)碼,還有一部分資源命中了強(qiáng)緩存,直接讀取了本地緩存。

但是,緩存并不是無限制的,會(huì)有大小的限制。無論是我們的 cookie(不同瀏覽器有所區(qū)別,一般在 4KB 左右),還是 localStorage(和 cookie 一樣,不同瀏覽器有所區(qū)別,有些瀏覽器為 5MB,有些瀏覽器為 10MB),都會(huì)有大小限制。

這個(gè)時(shí)候就需要涉及到一種算法,需要將超出大小限制的緩存進(jìn)行淘汰,一般的規(guī)則是淘汰掉最近沒有被訪問到的緩存,也就是今天要介紹的主角:LRU (Least recently used:最近最少使用)。當(dāng)然除了 LRU,常見的緩存淘汰還有 FIFO(first-in, first-out:先進(jìn)先出) 和 LFU(Least frequently used:最少使用)。

什么是 LRU?

LRU (Least recently used:最近最少使用)算法在緩存寫滿的時(shí)候,會(huì)根據(jù)所有數(shù)據(jù)的訪問記錄,淘汰掉未來被訪問幾率最低的數(shù)據(jù)。也就是說該算法認(rèn)為,最近被訪問過的數(shù)據(jù),在將來被訪問的幾率最大。

為了方便理解 LRU 算法的全流程,畫了一個(gè)簡單的圖:

  1. 假設(shè)我們有一塊內(nèi)存,一共能夠存儲(chǔ) 5 數(shù)據(jù)塊。
  2. 依次向內(nèi)存存入A、B、C、D、E,此時(shí)內(nèi)存已經(jīng)存滿。
  3. 再次插入新的數(shù)據(jù)時(shí),會(huì)將在內(nèi)存存放時(shí)間最久的數(shù)據(jù)A淘汰掉。
  4. 當(dāng)我們在外部再次讀取數(shù)據(jù)B時(shí),已經(jīng)處于末尾的B會(huì)被標(biāo)記為活躍狀態(tài),提到頭部,數(shù)據(jù)C就變成了存放時(shí)間最久的數(shù)據(jù)。
  5. 再次插入新的數(shù)據(jù)G,存放時(shí)間最久的數(shù)據(jù)C就會(huì)被淘汰掉。

算法實(shí)現(xiàn)

下面通過一段簡單的代碼來實(shí)現(xiàn)這個(gè)邏輯。

class LRUCache {
list = [] // 用于標(biāo)記先后順序
cache = {} // 用于緩存所有數(shù)據(jù)
capacity = 0 // 緩存的最大容量
constructor (capacity) {
// 存儲(chǔ) LRU 可緩存的最大容量
this.capacity = capacity
}
}

基本的結(jié)構(gòu)如上所示,LRU需要實(shí)現(xiàn)的就是兩個(gè)方法:get 和 put。

class LRUCache {
// 獲取數(shù)據(jù)
get (key) { }
// 存儲(chǔ)數(shù)據(jù)
put (key, value) { }
}

我們現(xiàn)在看看如何進(jìn)行數(shù)據(jù)的存儲(chǔ):

class LRUCache {
// 存儲(chǔ)數(shù)據(jù)
put (key, value) {
// 存儲(chǔ)之前需要先判斷長度是否達(dá)到上限
if (this.list.length >= this.capacity) {
// 由于每次存儲(chǔ)后,都會(huì)將 key 放入 list 最后,
// 所以,需要取出第一個(gè) key,并刪除cache中的數(shù)據(jù)。
const latest = this.list.shift()
delete this.cache[latest]
}
// 寫入緩存
this.cache[key] = value
// 寫入緩存后,需要將 key 放入 list 的最后
this.list.push(key)
}
}

然后,在每次獲取數(shù)據(jù)時(shí),都需要更新 list,將當(dāng)前獲取的 key 放到 list 的最后。

class LRUCache {
// 獲取數(shù)據(jù)
get (key) {
if (this.cache[key] !== undefined) {
// 如果 key 對應(yīng)的緩存存在
// 在返回緩存之前,需要重新激活 key
this.active(key)
return this.cache[key]
}
return undefined
}
// 重新激活key,將指定 key 移動(dòng)到 list 最后
active (key) {
// 先將 keylist 中刪除
const idx = this.list.indexOf(key)
if (idx !== -1) {
this.list.splice(idx, 1)
}
// 然后將 key 放到 list 最后面
this.list.push(key)
}
}

這個(gè)時(shí)候,其實(shí)還沒有完全實(shí)現(xiàn),因?yàn)槌?get 操作,put 操作也需要將對應(yīng)的 key 重新激活。

class LRUCache {
// 存儲(chǔ)數(shù)據(jù)
put (key, value) {
if (this.cache[key]) {
// 如果該 key 之前存在,將 key 重新激活
this.active(key)
this.cache[key] = value
// 而且此時(shí)緩存的長度不會(huì)發(fā)生變化
// 所以不需要進(jìn)行后續(xù)的長度判斷,可以直接返回
return
}

// 存儲(chǔ)之前需要先判斷長度是否達(dá)到上限
if (this.list.length >= this.capacity) {
// 由于每次存儲(chǔ)后,都會(huì)將 key 放入 list 最后,
// 所以,需要取出第一個(gè) key,并刪除cache中的數(shù)據(jù)。
const latest = this.list.shift()
delete this.cache[latest]
}
// 寫入緩存
this.cache[key] = value
// 寫入緩存后,需要將 key 放入 list 的最后
this.list.push(key)
}
}

可能會(huì)有人覺得這種算法在前端沒有什么應(yīng)用場景,說起來,在 Vue 的內(nèi)置組件 keep-alive 中就使用到了 LRU 算法。

后續(xù)應(yīng)該還會(huì)繼續(xù)介紹一下 LFU 算法,敬請期待。

責(zé)任編輯:姜華 來源: 自然醒的筆記本
相關(guān)推薦

2022-09-29 13:09:38

DataClassPython代碼

2025-01-15 09:06:57

servlet服務(wù)器Java

2022-09-06 11:21:49

光網(wǎng)絡(luò)光纖

2019-07-04 15:16:52

數(shù)據(jù)挖掘大數(shù)據(jù)算法

2023-05-17 11:33:45

梯度下降機(jī)器學(xué)習(xí)

2019-04-19 14:03:52

APISDK接口

2023-04-11 08:01:32

Web 開發(fā)源代碼映射

2023-11-20 08:18:49

Netty服務(wù)器

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2018-10-22 08:14:04

2019-11-14 09:16:56

物聯(lián)網(wǎng)技術(shù)路由器

2024-05-27 00:00:00

.NET游戲引擎C#

2023-10-27 08:15:45

2023-11-08 08:15:48

服務(wù)監(jiān)控Zipkin

2022-02-24 07:34:10

SSL協(xié)議加密

2020-02-02 15:14:24

HTTP黑科技前端

2022-04-28 09:22:46

Vue灰度發(fā)布代碼

2020-10-08 14:32:57

大數(shù)據(jù)工具技術(shù)

2022-03-23 08:31:25

LRU 算法JavaScripLFU 緩存算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)