前言
原文连接: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。