用LocalStorage實現一個LFU存儲系統

前言

原文鏈接:github.com/qiu...javascript

🤔Emm...好像沒什麼好說的,先厚着臉皮求個Star👉 LFUStorage吧!java

什麼是LFU

LFU(least frequently used),是操做系統中虛擬頁式存儲管理的頁面置換算法中的一種,其餘的還有:OPT(理想頁面置換算法)、FIFO(先進先出算法)和LRU(最近最久未使用算法)。git

到這裏難免又想起大學時候學習操做系統時的那段青澀青春github

LFU便是最近最不常使用置換算法,與LRU的區別是:LRU基於時間、LFU基於頻率。即LFU淘汰使用頻率最低的數據。 基於LFU的數據調度是這樣的: 假設咱們有2塊內存:算法

  • step1:數據a進來,內存塊是:a
  • step2:更新數據a,內存塊是:a
  • step3:數據b進來,內存塊是:a->b
  • step4:數據c進來,內存塊是:a->c(b被淘汰:a的頻率是2,b的頻率是1)

一個應用場景 假設咱們要實現一個基於本地存儲的聊天系統,咱們但願:在限定內存容量的狀況下,儘量地保留與我親密度較高的好友的聊天信息。而判斷好友親密度的維度是聊天頻率,那麼咱們的存儲系統就能夠基於LFU的策略去設計了。架構

介紹下LFUStorage

LFUStorage有如下幾個特色:性能

  • LFUStorage定義的存儲系統是相互隔離的,須要針對不一樣的存儲場景分別實例化LFUStorage對象;
  • 每一個存儲系統有本身的命名空間(能夠理解爲LocalStorage的key);
  • 每一個存儲系統的容量有限,能夠自定義容量值(默認數據項數目50,內存大小1MB);
  • 容量溢出優先淘汰使用頻率低的數據項;
  • 存儲系統的過時時間可自定義。

LFUStorage用法:學習

import LFUStorage from 'lfustorage'
  const chatStorage = new LFUStorage(namespace)  // namespace is optional
  chatStorage
    .nameSpace(namespace)  // setting namespace
    .max(num)  // setting data counts
    .expire(sec)  // setting expire time
    .on('overflow', (outKeys) => {})  // subscribe `overflow` event
    .off('overflow')  // unsubscribe

  chatStorage.set(key, val)  // set
  chatStorage.get(key)  // get
複製代碼

詳細API使勁戳👉:LFUStorage優化

後續迭代規劃

  • 增長LRU、FIFO置換算法,支持根據需求自定義置換策略
  • 完善內存分配的精確度
  • 優化代碼架構和性能

加個小廣告👉:若是您有意參與開發維護這個項目(隨便聊聊也行),歡迎加V:LiuShuiDW,備註LFUStorage。ui

相關文章
相關標籤/搜索