FIFO(First in First out),先进先出。
其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?
因为这个原则简单、且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中的队列即可实现。
在 FIFO Cache 设计中,核心原则就是:如果一个数据最先进入缓存中,则应该最早淘汰掉。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。
在 FIFO Cache 中应该支持以下操作:
get(key)
:如果 Cache 中存在该 key,则返回对应的 value 值,否则,返回 -1;set(key,value)
:如果 Cache 中存在该 key,则重置 value 值;如果不存在该 key,则将该 key 插入到到 Cache中,若 Cache 已满,则淘汰最早进入Cache的数据。
class FIFOCache {
constructor(limit) {
this.limit = limit || 5; // 缓存最大个数
this.map = {}; // 用于缓存的对象
}
set(key, value) {
const { map, limit } = this;
// 判断 map 是否有这个 key
// 这里用 == 而不是 ===,是为了把 null 和 undefined 都过滤,详情看类型转换
if (!Object.prototype.hasOwnProperty.call(map, key)
|| map[key] == undefined) {
map[key] = [value];
return;
}
const cacheForKey = map[key];
if (cacheForKey.length === limit) cacheForKey.shift();
cacheForKey.push(value);
}
get(key) {
return this.map[key];
}
clear(key) {
this.map[key] = undefined
}
}
const cache = new FIFOCache();
cache.set('konsoue', 555);
cache.set('konsoue', 55);
cache.set('konsoue', 11);
cache.set('konsoue', 13);
cache.set('konsoue', 12);
cache.clear('konsoue');
cache.set('konsoue', 126);
const list = cache.get('konsoue')
console.log(list);