用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

相关文章
相关标签/搜索