iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在keep-alive中使用LRU算法
  • 247
分享到

怎么在keep-alive中使用LRU算法

2023-06-15 07:06:09 247人浏览 独家记忆
摘要

怎么在keep-alive中使用LRU算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Vue的keep-alive内置组件的使用也是使用了改算法,源码如下:export&

怎么在keep-alive中使用LRU算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Vue的keep-alive内置组件的使用也是使用了改算法,源码如下:

export default {  name: "keep-alive",  // 抽象组件属性 ,它在组件实例建立父子关系的时候会被忽略,发生在 initLifecycle 的过程中  abstract: true,   props: {    // 被缓存组件    include: patternTypes,     // 不被缓存组件    exclude: patternTypes,    // 指定缓存大小    max: [String, Number]   },  created() {    // 初始化用于存储缓存的 cache 对象    this.cache = Object.create(null);    // 初始化用于存储Vnode key值的 keys 数组    this.keys = [];   },  destroyed() {    for (const key in this.cache) {      // 删除所有缓存      pruneCacheEntry(this.cache, key, this.keys);    }  },  mounted() {    // 监听缓存(include)/不缓存(exclude)组件的变化    // 在变化时,重新调整 cache    // pruneCache:遍历 cache,如果缓存的节点名称与传入的规则没有匹配上的话,就把这个节点从缓存中移除    this.$watch("include", val => {      pruneCache(this, name => matches(val, name));    });    this.$watch("exclude", val => {      pruneCache(this, name => !matches(val, name));    });  },  render() {    // 获取第一个子元素的 vnode    const slot = this.$slots.default;    const vnode: VNode = getFirstComponentChild(slot);    const componentOptions: ?VNodeComponentOptions =      vnode && vnode.componentOptions;    if (componentOptions) {      // name 不在 inlcude 中或者在 exlude 中则直接返回 vnode,否则继续进行下一步      // check pattern      const name: ?string = getComponentName(componentOptions);      const { include, exclude } = this;      if (        // not included        (include && (!name || !matches(include, name))) ||        // excluded        (exclude && name && matches(exclude, name))      ) {        return vnode;      }            const { cache, keys } = this;      // 获取键,优先获取组件的 name 字段,否则是组件的 tag      const key: ?string =        vnode.key == null          ? // same constructor may get reGIStered as different local components            // so cid alone is not enough (#3269)            componentOptions.Ctor.cid +            (componentOptions.tag ? `::${componentOptions.tag}` : "")          : vnode.key;              // --------------------------------------------------      // 下面就是 LRU 算法了,      // 如果在缓存里有则调整,      // 没有则放入(长度超过 max,则淘汰最近没有访问的)      // --------------------------------------------------      // 如果命中缓存,则从缓存中获取 vnode 的组件实例,并且调整 key 的顺序放入 keys 数组的末尾      if (cache[key]) {        vnode.componentInstance = cache[key].componentInstance;        // make current key freshest        remove(keys, key);        keys.push(key);      }      // 如果没有命中缓存,就把 vnode 放进缓存      else {        cache[key] = vnode;        keys.push(key);        // prune oldest entry        // 如果配置了 max 并且缓存的长度超过了 this.max,还要从缓存中删除第一个        if (this.max && keys.length > parseInt(this.max)) {          pruneCacheEntry(cache, keys[0], keys, this._vnode);        }      }            // keepAlive标记位      vnode.data.keepAlive = true;    }    return vnode || (slot && slot[0]);  }};// 移除 key 缓存function pruneCacheEntry (  cache: VNodeCache,  key: string,  keys: Array<string>,  current?: VNode) {  const cached = cache[key]  if (cached && (!current || cached.tag !== current.tag)) {    cached.componentInstance.$destroy()  }  cache[key] = null  remove(keys, key)}// remove 方法(shared/util.js)export function remove (arr: Array<any>, item: any): Array<any> | void {  if (arr.length) {    const index = arr.indexOf(item)    if (index > -1) {      return arr.splice(index, 1)    }  }}

实现一个自己的LRU算法

lru算法 的核心api(put get)和一个size最大容器值,本质是类似队列 put实现思路 1 是否存在,存在就先删除,再添加到队头 2 不存在,容量是否满了,删除最后一个队尾,再添加队头 get实现思路: 1.有就返回,同时插入队头 2.没有返回-1 时间复杂度O(1)

class LRU {  constructor(size) {    this.cache = new Map()    this.size = size  }  put (key, val) {    //存在    if (this.cache.has(key)) {      //删除      this.cache.delete(key)    } else {      //不存在,容量是否满了      if (this.size === this.cache.size) {        //删除最后一个        this.cache.delete(this.cache.keys().next().value) //拿到队尾的元素      }    }    //插在队头    this.cache.set(key, val)  }  get (key) {    let val = this.cache.get(key)    if (!val) {      return -1    }    //访问了就需要放在队头    this.put(key, val)    return val  }}

另一种

//定义节点类class Node {    constructor(pre, next, value, key){        this.pre = pre;        this.next = next;        this.value = value;        this.key = key;    }}//定义双向链表class DoubleList {    constructor(head, tail){        this.head = head;        this.tail = tail;    }}class LRUCache {    //构造函数,传入缓存容量    constructor(max){        this.max = max;        this.map = new Map();        let node = new Node(null, null, null, null);        this.doubleList = new DoubleList(node, node);    }            get(key){        let node = this.map.get(key)        if(!node){            return -1;        }else{            this.moveNode2Tail(key, node);            return node.value;        }    }        put(key, value) {        let node = this.map.get(key);        if(node){            if(!node.next){                node.value = value;                return;            }            node.pre.next = node.next;            node.next.pre = node.pre;        }        let newNode = new Node(null, null, value, key);        newNode.pre = this.doubleList.tail;        this.doubleList.tail.next = newNode;        this.doubleList.tail = newNode;        this.map.set(key, newNode);        if(this.map.size > this.max){            this.map.delete(this.doubleList.head.next.key);            this.doubleList.head.next = this.doubleList.head.next.next;            this.doubleList.head.next.pre = this.doubleList.head;                  }    }        //将节点移到尾巴    moveNode2Tail(key,node){           if(!node.next){            return;        }        //删除节点           node.pre.next = node.next;        node.next.pre = node.pre;        this.map.delete(key)        //新增尾巴节点        let newNode = new Node(null, null, node.value, key);        newNode.pre = this.doubleList.tail;        this.doubleList.tail.next = newNode;        this.doubleList.tail = newNode;        this.map.set(key, newNode);    }}

关于怎么在keep-alive中使用LRU算法问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 怎么在keep-alive中使用LRU算法

本文链接: https://www.lsjlt.com/news/278715.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在keep-alive中使用LRU算法
    怎么在keep-alive中使用LRU算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。vue的keep-alive内置组件的使用也是使用了改算法,源码如下:export&...
    99+
    2023-06-15
  • LRU算法在Vue内置组件keep-alive中的使用
    目录vue的keep-alive内置组件的使用也是使用了改算法,源码如下:实现一个自己的LRU算法另一种vue的keep-alive内置组件的使用也是使用了改算法,源码如下: e...
    99+
    2022-11-12
  • keep-alive组件怎么在Vue中使用
    这篇文章将为大家详细讲解有关keep-alive组件怎么在Vue中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一、keep-alive 用法< keep-alive> 包...
    99+
    2023-06-14
  • vue2.0中keep-alive怎么用
    这篇文章主要介绍vue2.0中keep-alive怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.基本用法vue2.0提供了一个keep-alive组件用来缓存组件,避免多次...
    99+
    2022-10-19
  • Vue的keep-alive怎么使用
    这篇文章主要讲解了“Vue的keep-alive怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue的keep-alive怎么使用”吧! 用法 ...
    99+
    2022-10-19
  • vue中keep-alive组件怎么用
    这篇文章将为大家详细讲解有关vue中keep-alive组件怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述(什么是keep-alive)keep-alive顾名思义,保持活跃。保持谁活跃呢?...
    99+
    2023-06-15
  • vue的keep-alive怎么正确使用
    这篇文章主要讲解了“vue的keep-alive怎么正确使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue的keep-alive怎么正确使用”吧! ...
    99+
    2022-10-19
  • vue内置组件keep-alive怎么使用
    这篇文章主要讲解了“vue内置组件keep-alive怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue内置组件keep-alive怎么使用”吧!一、Keep-alive 是什么k...
    99+
    2023-07-04
  • 关于Vue中keep-alive的作用及使用方法
    目录一、概念:二、作用:三、属性四、使用场景五、使用方式:一、概念: keep-alive是Vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,该组件将不会销毁。 二、作用...
    99+
    2023-05-17
    Vue中keep-alive使用 Vue中keep-alive作用
  • Redis中的LRU算法有什么用
    这篇文章给大家分享的是有关Redis中的LRU算法有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis是基于内存存储的key-value...
    99+
    2022-10-18
  • vue使用webpack打包后keep-alive不生效怎么办
    这篇文章将为大家详细讲解有关vue使用webpack打包后keep-alive不生效怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题是这样的,我使用webpack...
    99+
    2022-10-19
  • Java 中怎么自定义一个LRU 缓存算法
    今天就跟大家聊聊有关Java 中怎么自定义一个LRU 缓存算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。背景LinkedHashMap继承自HashMap,内部提供了一个remo...
    99+
    2023-06-17
  • 怎么在Python中使用dHash算法
    这篇文章将为大家详细讲解有关怎么在Python中使用dHash算法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WE...
    99+
    2023-06-14
  • vue使用keep-alive后从部分页面进入不缓存怎么解决
    这篇文章主要介绍了vue使用keep-alive后从部分页面进入不缓存怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue使用keep-alive后从部分页面进入不缓存怎么解决文章都会有所收获,下面我们...
    99+
    2023-07-05
  • CAS算法在JDK中怎么应用
    今天小编给大家分享一下CAS算法在JDK中怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、什么是CAS?CAS:C...
    99+
    2023-06-02
  • K-means算法怎么在Python中应用
    这篇文章将为大家详细讲解有关K-means算法怎么在Python中应用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动...
    99+
    2023-06-14
  • 怎么在java 项目中使用归并排序算法
    怎么在java 项目中使用归并排序算法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。归并排序     &nbs...
    99+
    2023-05-31
    java 归并排序 ava
  • 怎么在PHP中使用RSA非对称加密算法
    本篇文章给大家分享的是有关怎么在PHP中使用RSA非对称加密算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言...
    99+
    2023-06-14
  • 怎么在Java中使用DFA算法过滤敏感词
    怎么在Java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体实现: 1、匹配大小写过滤 2、匹配全角半角过滤 3...
    99+
    2023-05-30
    java dfa
  • Vue2中的Diff算法怎么使用
    这篇文章主要介绍了Vue2中的Diff算法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue2中的Diff算法怎么使用文章都会有所收获,下面我们一起来看看吧。为什么要用 Diff 算法虚拟 DOM因为...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作