用LocalStorage实现一个LFU存储系统

前言

原文连接:github.com/qiu...

?Emm...好像没什么好说的,先厚着脸皮求个Star? LFUStorage吧!

什么是LFU

LFU(least frequently used),是操作系统中虚拟页式存储管理的页面置换算法中的一种,其他的还有:OPT(理想页面置换算法)、FIFO(先进先出算法)和LRU(最近最久未使用算法)。

到这里不免又想起大学时候学习操作系统时的那段青涩青春

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。

转载于:https://juejin.im/post/5cbc7291e51d456e303db895

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值