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) 的平均时间复杂度运行

    链接:https://leetcode-cn.com/problems/lru-cache

截屏2022-02-27 下午8.46.24.png

  1. /**
  2. * @param {number} capacity
  3. */
  4. var LRUCache = function(capacity) {
  5. this.cache = new Map()
  6. // capacity代表缓存的最大容量
  7. this.max = capacity
  8. };
  9. /**
  10. * @param {number} key
  11. * @return {number}
  12. */
  13. LRUCache.prototype.get = function(key) {
  14. if(this.cache.has(key)){
  15. let tmp = this.cache.get(key)
  16. this.cache.delete(key)
  17. this.cache.set(key,tmp)
  18. return tmp
  19. }else {
  20. return -1
  21. }
  22. };
  23. /**
  24. * @param {number} key
  25. * @param {number} value
  26. * @return {void}
  27. */
  28. LRUCache.prototype.put = function(key, value) {
  29. if(this.cache.has(key)){
  30. this.cache.delete(key)
  31. }else if(this.cache.size >= this.max){
  32. this.cache.delete(this.cache.keys().next().value)
  33. }
  34. this.cache.set(key,value)
  35. };
  36. /**
  37. * Your LRUCache object will be instantiated and called as such:
  38. * var obj = new LRUCache(capacity)
  39. * var param_1 = obj.get(key)
  40. * obj.put(key,value)
  41. */