」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Javascript 實作 LRU 緩存

使用 Javascript 實作 LRU 緩存

發佈於2024-10-31
瀏覽:503

LRU Cache Implementation using Javascript

介紹

LRU 代表最近最少使用。 LRU 快取是一種緩存,當快取達到其容量時,最近最少使用的條目將被刪除。

  • 使用LRU快取的主要原因是為了提高存取資料的效能。從快取存取資料通常比從主記憶體或遠端伺服器檢索資料更快。
  • 透過將最近使用的資料儲存在快取中,增加了快取命中的機會,從而提高了資料檢索的速度。

供參考:

  • 映射資料結構用於模仿哈希表的行為。這允許高效的查找、插入和刪除操作。
  • 實現了雙鍊錶以實現元素之間的輕鬆移動。這提供了雙向遍歷(向前和向後)並執行恆定時間插入和刪除的能力。
  • 這兩種資料結構的結合可以實現高效率的操作,利用雜湊表和雙鍊錶的優點。

以下是如何在 JavaScript 中實作 LRU 快取的基本範例:

// Why we need this LRU
class Node {
    constructor(key, value) {
        this.key = key;
        this.value = value;
        this.next = null;
        this.prev = null;
    }
}

//Least Recently used
class LRU {
    constructor() {
     this.head = this.tail = null;
     this.map = new Map();
     this.size = 0; // Why I added size, because may be in future we can say if capacity reach to the size, we will remove the tail first and then insert.
    }

    get(key) {
        if (this.map.has(key)) {
            const node = this.map.get(key);

            if (node !== this.head) {
                this.remove(node);
                this.insert(node);
            }

            return node.value;
        }

        return -1;
    }

    update(key, value) {
        if (this.map.has(key)) {
            let node = this.map.get(key);
            node.value = value;

            if (node !== this.head) {
                this.remove(node);
                this.insert(node);
            }

            return node.value;
        } else {
            console.log('Key not found'); 
            // Here we can check for capacity if available we can call insert
            // if capacity is not available we will remove the tail and then insert.
        }
    }

    remove(node) {
        if (node === this.tail) {
            this.tail = this.tail.prev;
        }

        const prevNode = node.prev;
        const nextNode = node.next;

        prevNode.next = nextNode;
        nextNode.prev = prevNode;
    }

    insert(key, value) {
        const newNode = new Node(key, value);
        this.map.set(key, newNode);
        if (this.head === null) {
            this.head = this.tail = newNode;
            this.size = 1;
            return;
        }
        // We need to insert at the Begining
        newNode.next = this.head;
        this.head.prev = newNode;
        this.head= newNode;
        this.size  ;
        return;
    }
}

const test = new LRU();
test.insert('A', 20);
test.insert('B', 10);
test.insert('C', 5);
test.insert('D', 7);

console.log(test);
console.log('------------------');
console.log('C ---> ', test.get('C'));
console.log('D ---> ', test.get('D'));

console.log('D ---> ', test.update('B', 100));

/*
LRU {
  tail:  Node {
    key: 'A',
    value: 20,
    next: null,
    prev: Node { key: 'B', value: 10, next: [Circular *1], prev: [Node] }
  },
  head:  Node {
    key: 'D',
    value: 7,
    next: Node { key: 'C', value: 5, next: [Node], prev: [Circular *2] },
    prev: null
  },
  map: Map(4) {
    'A' =>  Node {
      key: 'A',
      value: 20,
      next: null,
      prev: [Node]
    },
    'B' => Node { key: 'B', value: 10, next: [Node], prev: [Node] },
    'C' => Node { key: 'C', value: 5, next: [Node], prev: [Node] },
    'D' =>  Node {
      key: 'D',
      value: 7,
      next: [Node],
      prev: null
    }
  },
  size: 4
}
------------------
C --->  5
D --->  7
D --->  100
B --->  100
*/

如果您有任何疑問,請隨時與我聯繫。

版本聲明 本文轉載於:https://dev.to/ashutoshsarangi/lru-cache-implementation-using-javascript-48no?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用 Python 檢索 Github 儲存庫數據
    如何使用 Python 檢索 Github 儲存庫數據
    您的組織是否擁有太多github 儲存庫,並且您需要一種簡單的方法來總結和記錄每個儲存庫的內容以用於報告、儀表板或審計目的?下面是一個使用 Github API 完成該操作的快速腳本。 功能: get_repo_info(所有者,回購): 取得 GitHub 儲存庫擁有者的使用者名...
    程式設計 發佈於2024-11-08
  • 使用 useState 的狀態更新方法
    使用 useState 的狀態更新方法
    React 是用於開發動態和互動式使用者介面的最受歡迎的 JavaScript 程式庫之一。在開發應用程式時,狀態管理對於效能和使用者體驗至關重要。在這種情況下,useState 掛鉤是管理元件狀態的最常見方法之一。在本文中,我們將深入研究 useState. 的狀態更新方法 狀態更...
    程式設計 發佈於2024-11-08
  • 考慮到 libcurl 的可用性,何時適合在 PHP 中啟用「allow_url_fopen」?
    考慮到 libcurl 的可用性,何時適合在 PHP 中啟用「allow_url_fopen」?
    在 PHP 中允許「allow_url_fopen」:平衡行為開發人員經常要求在 PHP 中啟動「allow_url_fopen」。在本文中,我們將檢查目前的行業規格並評估允許此功能是否仍然謹慎,特別是在 libcurl 可用的情況下。 當前行業規範對於大多數 Web 應用程序,啟用“allow_u...
    程式設計 發佈於2024-11-08
  • 何時在 jQuery.parseJSON 中使用單引號和雙引號?
    何時在 jQuery.parseJSON 中使用單引號和雙引號?
    jQuery.parseJSON 中的單引號與雙引號使用jQuery 的parseJSON 方法時,使用者可能會遇到行為差異,具體取決於是單引號還是雙引號雙引號用於將JSON 字串括起來。在本文中,我們將探討這些差異。 雙引號:標準方法根據 JSON 標準,雙引號被認為是括起的首選方法JSON 字串...
    程式設計 發佈於2024-11-08
  • 如何處理多處理 Python 應用程式中的日誌記錄?
    如何處理多處理 Python 應用程式中的日誌記錄?
    Python 中的多處理日誌記錄使用Python 的多處理模組時,重要的是要考慮日誌記錄實踐,以避免因多個進程寫入而導致錯誤同時處理相同的檔案句柄。預設情況下,mp.get_logger() 提供的多處理感知記錄器可確保 sys.stderr 中正確的鎖定機制。 但是,不支援多處理感知的模組可能需要...
    程式設計 發佈於2024-11-08
  • 答:我如何運行特定的phinx seeder並在phpunit中取得產生的記錄?
    答:我如何運行特定的phinx seeder並在phpunit中取得產生的記錄?
    這個答案解決了我遇到的一個問題:在 phpunit 上運行 Phinx 播種者: 回答回覆:我如何運行特定的phinx seeder並在phpunit中取得產生的記錄? ...
    程式設計 發佈於2024-11-08
  • 如何以程式設計方式為 LinearLayout 中的按鈕新增邊距?
    如何以程式設計方式為 LinearLayout 中的按鈕新增邊距?
    LinearLayout 中的動態邊距LinearLayout 中的動態邊距在Android 開發中,佈局在組織和顯示使用者介面元素方面發揮著至關重要的作用。佈局的一個常見要求是能夠指定元素之間的邊距。雖然 XML 提供了一種直觀的方式來定義邊距,但開發人員可能需要以程式設計方式建立佈局以確保靈活性...
    程式設計 發佈於2024-11-08
  • 如何使用 PowerMock 和 Mockito 有效模擬私有方法?
    如何使用 PowerMock 和 Mockito 有效模擬私有方法?
    使用PowerMock 模擬私有方法的替代解決方案儘管最初提出的使用PowerMock 的解決方案遇到了困難,但事實證明,另一種方法是成功的。使用 Mockito 和 PowerMock 的組合,可以有效地模擬私有方法。 如提供的程式碼片段所示,類別 CodeWithPrivateMethod 擁有...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中將列式資料結構轉換為基於行的格式?
    如何在 PHP 中將列式資料結構轉換為基於行的格式?
    將多維列式資料重新排序為基於行的結構給定一個具有面向列資料的關聯數組,任務是將其轉置為由行組成的多維數組。原始數組中的資料按列排列,目標是將同一列的值合併到行中。 原始陣列:$where = [ 'id' => [ 12, 13, 14 ...
    程式設計 發佈於2024-11-08
  • Next.JS 或 Nuxt.JS 哪個最好
    Next.JS 或 Nuxt.JS 哪個最好
    The ability to build scalable and seamless web applications quickly is the dream of every web developer. As a result, the importance of frameworks in ...
    程式設計 發佈於2024-11-08
  • 了解 RESTful API 和 Web 服務:主要差異和用例
    了解 RESTful API 和 Web 服務:主要差異和用例
    在現代軟體開發領域,RESTful API 和 Web 服務都是實現不同系統之間無縫通訊的基礎。雖然這些術語經常互換使用,但它們代表具有獨特特徵和用例的不同概念。對於旨在建立高效、可互通且可擴展的應用程式的開發人員來說,掌握 RESTful API 和 Web 服務 之間的差異至關重要。在本節中,我...
    程式設計 發佈於2024-11-08
  • React 應用程式的基本設計模式:升級您的組件遊戲
    React 應用程式的基本設計模式:升級您的組件遊戲
    如果您已经进入 React 世界一段时间,您可能听说过“这只是 JavaScript”这句话。虽然这是事实,但这并不意味着我们不能从一些经过验证的模式中受益,使我们的 React 应用程序更易于维护、可重用并且使用起来更加愉快。让我们深入研究一些基本的设计模式,这些模式可以让你的 React 组件从...
    程式設計 發佈於2024-11-08
  • 使用 PHP 建立 API 和 Web 服務
    使用 PHP 建立 API 和 Web 服務
    使用 PHP 建立 API 和 Web 服務涉及以下步驟:建立 PHP 環境,安裝 PHP、Apache 伺服器和 mod_php 模組。建立 API,編寫 PHP 腳本處理請求並回傳回應。建立 Web 服務,使用 PHP 框架或純 PHP 來建立伺服器。實戰案例:建立用戶註冊 API,處理 POS...
    程式設計 發佈於2024-11-08
  • Restful 路由 - Flask API 範例
    Restful 路由 - Flask API 範例
    Restful 路由致力於使所有不同應用程式的路由保持一致。 REST 是表述性狀態轉移。它以一致的、人類可讀的、機器可讀的方式使用 HTTP。 標準是 GET、POST、PATCH、PUT 和 DELETE。 下面將給出 Flask API 資料庫中的幾個靜態路由的範例,用於從前端獲取/向前端...
    程式設計 發佈於2024-11-08
  • ## 如何在沒有反向引用的情況下匹配 Go 正規表示式中的重複字元?
    ## 如何在沒有反向引用的情況下匹配 Go 正規表示式中的重複字元?
    在Go 的正規表示式中符合重複字元在Go 的正規表示式中,符合重複字元可能是一個挑戰,因為不支援反向引用。這可能會令人沮喪,特別是當您需要執行複雜的模式匹配任務時。 要解決此限制,有兩種可能的解決方案:使用替代正則表達式庫:一種選擇是使用支援反向引用的第三方正規表示式庫。一個流行的選擇是“glenn...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3