LRU
LRU(Least Recently Used)最近最少使用缓存策略,根据历史数据记录,当数据超过了限定空间的时候对数据清理,清理的原则是对很久没有使用到过的数据进行清除。
一、为什么要使用 Map 是来定义容器
Map 在保存数据时会按照记住存储数据时候的顺序,这样存储的数据是有序列的,并且会维护键值对的插入顺序,Map 存储数据的键值可以是任意类型(对象或者基本类型都可),Map 提供了 get、set、delete 方法十分方便;而Object
的话是无序,当然也可以使用Array
。另外 Map 的算法复杂度是 O(1),处理数据更迅速。
二、应用场景
redis
浏览器浏览记录
vue 中内置组件 keep-alive
三、代码实现
实现的大概思路如下:
创建一个 LRUCache 类
定义容器以及容器的容量
定义 set 方面,设置容器中的数据
定义 get 方法,获取容器中的数据
class LRUCache {
constructor(length) {
// 定义容器容量
this.length = length;
// 创建数据容器,生成一个空映射
this.map = new Map();
}
// 设置key值
set(key, value) {
}
// 获取key值
get(key) {}
}
复制代码
接下来就是对 set 方法和 get 方法的处理:
class LRUCache {
constructor(length) {
// 定义容器容量
this.length = length;
// 定义数据容器
this.map = new Map();
}
// 设置key值
set(key, value) {
// 如果容器容量超过设定的容量
if (this.map.size >= this.length) {
// 等价于:let firstKey = this.map.keys()[0]
//map.keys().next()查询容器中第一条数据的key值
//keys()会返回一个迭代器对象,包含了实力对象中的每一个key值
let firstKey = this.map.keys().next().value;
//删除容器中第一条数据
this.map.delete(firstKey);
}
// 容器中存在key就先删除掉
if (this.map.has(key)) {
this.map.delete(key);
}
// 删除后重新加入该条数据
this.map.set(key, value);
}
// 获取key值
get(key) {
// 获取key值不存在返回null
if (!this.map.has(key)) {
return null;
}
// 获取key值
let value = this.map.get(key);
//删除容器中的该条数据
this.map.delete(key);
//重新把该条数据添加到容器中
this.map.set(key, value);
return value
}
}
// 创建实例对象并设置容器大小
const lruCache = new LRUCache(5)
复制代码
添加 6 条数据
lruCache.set('name', 'zhangsan')
lruCache.set('class', 'xinguan')
lruCache.set('age', 19)
lruCache.set('sex', '男')
lruCache.set('occupation', '前端工程师')
lruCache.set('year', '2023')
console.log(lruCache, 'lruCache')
复制代码
对 lruCache 添加了 6 条数据并按顺序排列,打印出来只剩 5 条数据,添加的第一条('name', 'zhangsan')被删除了。
然后获取 class 的值,发现 key 为 class 的这条数据跑最后了。因为在 get 时候先 delete 后 set 了。
console.log(lruCache.get('class'), 'lruCache')//xinguan
复制代码
评论