<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        如何操作JS使用緩存算法

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 19:36:57
        文檔

        如何操作JS使用緩存算法

        如何操作JS使用緩存算法:這次給大家?guī)砣绾尾僮鱆S使用緩存算法,操作JS使用緩存算法的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。FIFO最簡單的一種緩存算法,設(shè)置緩存上限,當(dāng)達(dá)到了緩存上限的時候,按照先進先出的策略進行淘汰,再增加進新的 k-v 。使用了一個對象作為緩存
        推薦度:
        導(dǎo)讀如何操作JS使用緩存算法:這次給大家?guī)砣绾尾僮鱆S使用緩存算法,操作JS使用緩存算法的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。FIFO最簡單的一種緩存算法,設(shè)置緩存上限,當(dāng)達(dá)到了緩存上限的時候,按照先進先出的策略進行淘汰,再增加進新的 k-v 。使用了一個對象作為緩存

        這次給大家?guī)砣绾尾僮鱆S使用緩存算法,操作JS使用緩存算法的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。

        FIFO

        最簡單的一種緩存算法,設(shè)置緩存上限,當(dāng)達(dá)到了緩存上限的時候,按照先進先出的策略進行淘汰,再增加進新的 k-v 。

        使用了一個對象作為緩存,一個數(shù)組配合著記錄添加進對象時的順序,判斷是否到達(dá)上限,若到達(dá)上限取數(shù)組中的第一個元素key,對應(yīng)刪除對象中的鍵值。

        /**
         * FIFO隊列算法實現(xiàn)緩存
         * 需要一個對象和一個數(shù)組作為輔助
         * 數(shù)組記錄進入順序
         */
        class FifoCache{
         constructor(limit){
         this.limit = limit || 10
         this.map = {}
         this.keys = []
         }
         set(key,value){
         let map = this.map
         let keys = this.keys
         if (!Object.prototype.hasOwnProperty.call(map,key)) {
         if (keys.length === this.limit) {
         delete map[keys.shift()]//先進先出,刪除隊列第一個元素
         }
         keys.push(key)
         }
         map[key] = value//無論存在與否都對map中的key賦值
         }
         get(key){
         return this.map[key]
         }
        }
        module.exports = FifoCache

        LRU

        LRU(Least recently used,最近最少使用)算法。該算法的觀點是,最近被訪問的數(shù)據(jù)那么它將來訪問的概率就大,緩存滿的時候,優(yōu)先淘汰最無人問津者。

        算法實現(xiàn)思路:基于一個雙鏈表的數(shù)據(jù)結(jié)構(gòu),在沒有滿員的情況下,新來的 k-v 放在鏈表的頭部,以后每次獲取緩存中的 k-v 時就將該k-v移到最前面,緩存滿的時候優(yōu)先淘汰末尾的。

        雙向鏈表的特點,具有頭尾指針,每個節(jié)點都有 prev(前驅(qū)) 和 next(后繼) 指針分別指向他的前一個和后一個節(jié)點。

        關(guān)鍵點:在雙鏈表的插入過程中要注意順序問題,一定是在保持鏈表不斷的情況下先處理指針,最后才將原頭指針指向新插入的元素,在代碼的實現(xiàn)中請注意看我在注釋中說明的順序注意點!

        class LruCache {
         constructor(limit) {
         this.limit = limit || 10
         //head 指針指向表頭元素,即為最常用的元素
         this.head = this.tail = undefined
         this.map = {}
         this.size = 0
         }
         get(key, IfreturnNode) {
         let node = this.map[key]
         // 如果查找不到含有`key`這個屬性的緩存對象
         if (node === undefined) return
         // 如果查找到的緩存對象已經(jīng)是 tail (最近使用過的)
         if (node === this.head) { //判斷該節(jié)點是不是是第一個節(jié)點
         // 是的話,皆大歡喜,不用移動元素,直接返回
         return returnnode ?
         node :
         node.value
         }
         // 不是頭結(jié)點,鐵定要移動元素了
         if (node.prev) { //首先要判斷該節(jié)點是不是有前驅(qū)
         if (node === this.tail) { //有前驅(qū),若是尾節(jié)點的話多一步,讓尾指針指向當(dāng)前節(jié)點的前驅(qū)
         this.tail = node.prev
         }
         //把當(dāng)前節(jié)點的后繼交接給當(dāng)前節(jié)點的前驅(qū)去指向。
         node.prev.next = node.next
         }
         if (node.next) { //判斷該節(jié)點是不是有后繼
         //有后繼的話直接讓后繼的前驅(qū)指向當(dāng)前節(jié)點的前驅(qū)
         node.next.prev = node.prev
         //整個一個過程就是把當(dāng)前節(jié)點拿出來,并且保證鏈表不斷,下面開始移動當(dāng)前節(jié)點了
         }
         node.prev = undefined //移動到最前面,所以沒了前驅(qū)
         node.next = this.head //注意!!! 這里要先把之前的排頭給接到手!!!!讓當(dāng)前節(jié)點的后繼指向原排頭
         if (this.head) {
         this.head.prev = node //讓之前的排頭的前驅(qū)指向現(xiàn)在的節(jié)點
         }
         this.head = node //完成了交接,才能執(zhí)行此步!不然就找不到之前的排頭啦!
         return IfreturnNode ?
         node :
         node.value
         }
         set(key, value) {
         // 之前的算法可以直接存k-v但是現(xiàn)在要把簡單的 k-v 封裝成一個滿足雙鏈表的節(jié)點
         //1.查看是否已經(jīng)有了該節(jié)點
         let node = this.get(key, true)
         if (!node) {
         if (this.size === this.limit) { //判斷緩存是否達(dá)到上限
         //達(dá)到了,要刪最后一個節(jié)點了。
         if (this.tail) {
         this.tail = this.tail.prev
         this.tail.prev.next = undefined
         //平滑斷鏈之后,銷毀當(dāng)前節(jié)點
         this.tail.prev = this.tail.next = undefined
         this.map[this.tail.key] = undefined
         //當(dāng)前緩存內(nèi)存釋放一個槽位
         this.size--
         }
         node = {
         key: key
         }
         this.map[key] = node
         if(this.head){//判斷緩存里面是不是有節(jié)點
         this.head.prev = node
         node.next = this.head
         }else{
         //緩存里沒有值,皆大歡喜,直接讓head指向新節(jié)點就行了
         this.head = node
         this.tail = node
         }
         this.size++//減少一個緩存槽位
         }
         }
         //節(jié)點存不存在都要給他重新賦值啊
         node.value = value
         }
        }
        module.exports = LruCache

        具體的思路就是如果所要get的節(jié)點不是頭結(jié)點(即已經(jīng)是最近使用的節(jié)點了,不需要移動節(jié)點位置)要先進行平滑的斷鏈操作,處理好指針指向的關(guān)系,拿出需要移動到最前面的節(jié)點,進行鏈表的插入操作。

        相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注Gxl網(wǎng)其它相關(guān)文章!

        推薦閱讀:

        如何在項目中使用PHP靜態(tài)綁定

        如何操作vue代碼規(guī)范檢測

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        如何操作JS使用緩存算法

        如何操作JS使用緩存算法:這次給大家?guī)砣绾尾僮鱆S使用緩存算法,操作JS使用緩存算法的注意事項有哪些,下面就是實戰(zhàn)案例,一起來看一下。FIFO最簡單的一種緩存算法,設(shè)置緩存上限,當(dāng)達(dá)到了緩存上限的時候,按照先進先出的策略進行淘汰,再增加進新的 k-v 。使用了一個對象作為緩存
        推薦度:
        標(biāo)簽: 使用 緩存 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲性线免费观看视频成熟| 午夜影院免费观看| 在线观看免费宅男视频| 亚洲成在人线中文字幕| 最近2019中文字幕免费大全5| 亚洲精品高清久久| 久久久精品2019免费观看 | 亚洲中文字幕日本无线码| 亚洲免费视频观看| 亚洲一级黄色大片| 成人免费男女视频网站慢动作| 在线亚洲午夜片AV大片| 免费观看的毛片手机视频| 国产精品亚洲а∨无码播放麻豆 | 国产亚洲人成在线播放| 久久亚洲AV无码精品色午夜| 99精品视频在线观看免费播放| 日韩免费观看一级毛片看看| 亚洲AV无码成人精品区日韩| 国产精品无码一区二区三区免费| 亚洲av无码成人精品区一本二本| 亚洲国产精品丝袜在线观看| 在线涩涩免费观看国产精品| 亚洲第一二三四区| 在线观看亚洲免费视频| 精品一区二区三区免费视频| 亚洲黄色在线网站| 四虎永久免费地址在线观看| 好吊色永久免费视频大全| 亚洲国产成人久久精品动漫| 99re热免费精品视频观看 | 亚洲av无码一区二区三区乱子伦 | 亚洲精品国产精品国自产网站| 日本一区免费电影| 视频免费在线观看| 亚洲一卡2卡4卡5卡6卡残暴在线| 免费一级毛片在级播放| 免费人成视频在线观看网站| 亚洲AV第一成肉网| 久久精品国产亚洲AV电影| 国产一级淫片a免费播放口之 |