vue3组件keep-alive源码使用lru-chache vue中keep-alive组件的缓存个数是有限的,而不是无数个,否则内存会挤爆。
一、常见的缓存模式
- 队列形式:first in first out,先进先出。规定缓存多少个,超过规定的个数,就删除最先进来的,保存后进来的,通常用于任务,而不是用于组件
- 计算每个缓存组件使用的次数,超过规定的缓存个数,先删除使用次数最少的,保留使用次数多的。这种计算量过大。
- LRU缓存(last recently use cache 最近使用的缓存):规定最多的缓存个数,如果没有超出规定的缓存个数,使用某个缓存,如果这个缓存已经存在,就把这个缓存排在最前面,如果这个缓存没有就增加一个缓存,增加的这个缓存也排最前面,如果增加缓存的时候,超过缓存的个数,自动删除最后一个缓存。像链表形式,下面用的是Iterator构造器实现(构造器恰好跟上面的描述相反,因为Set和Map的数据结构的遍历是按照顺序的
Map.keys().next().val就可以得到最前面的key值,所以新增或新使用的缓存使用Map.set()排在最后一个,删除最前面的一个),keep-alive组件所使用的缓存模式。二、LRU缓存
leetcode146题:LRU缓存请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。 函数 get 和 put 必须以 O(1) 的平均时间复杂度运行

/*** @param {number} capacity*/var LRUCache = function(capacity) {this.cache = new Map()// capacity代表缓存的最大容量this.max = capacity};/*** @param {number} key* @return {number}*/LRUCache.prototype.get = function(key) {if(this.cache.has(key)){let tmp = this.cache.get(key)this.cache.delete(key)this.cache.set(key,tmp)return tmp}else {return -1}};/*** @param {number} key* @param {number} value* @return {void}*/LRUCache.prototype.put = function(key, value) {if(this.cache.has(key)){this.cache.delete(key)}else if(this.cache.size >= this.max){this.cache.delete(this.cache.keys().next().value)}this.cache.set(key,value)};/*** Your LRUCache object will be instantiated and called as such:* var obj = new LRUCache(capacity)* var param_1 = obj.get(key)* obj.put(key,value)*/
