LRU(最近最少使用)缓存机制在前端开发中的实际应用

1 篇文章 0 订阅

一、 需求:检查项里面配有摄像头。可重复配置,初始化播放前三个视频,然后点播放视频a,
1. a如果和当前列表重复,则此视频高亮。并且将a的顺序调到最后面
2. A如果是新视频,则替换列表中最前面操作的视频
在这里插入图片描述

二、业务调用
初始化三个视频

let len = 3
this.cameraNodes = new LRUcache(len)
 for(var i=0; i<len; i++){
     //这里闭包传入i 保证i是正确的0,1.。。而不是都是len
     (function(i){
         //使用延时是因为要ref.init有接口调用,
         setTimeout(() => {
             let { deviceCode, deviceName } = this.allCameraList[i],
                 cameraItem = this.cameraNodes.get(deviceCode),
                 ref = {}

             if (!cameraItem) {  
                 ref = this.$refs.sVideo[i]
                 cameraItem = {
                     deviceCode,
                     deviceName,
                     ref,
                     refIndex: i
                 }

                 this.cameraNodes.put(deviceCode, cameraItem)
                 ref.init({ deviceCode, deviceName })

             } else {
                 i--   //前三个也可能会重复。如若重复。i不作自增
             }
         }, 1000)
     }).bind(this)(i)
 }

三、 LRU设计实现
设计一个队列keys、 缓存对象cache,len:播放列表数

  1. keys是一个大小为len的队列数组 ,按照操作的先后顺序 存下视频的key,
  2. cache 存下key对应的值
var LRUCache = function(max) {
    this.max = max
    //存入key: value
    this.cache = Object.create(null)
    //队列先入先出 保存当前坑位对应的key  最新的操作在最后面  
    this.keys = []
}

LRUCache.prototype.put = function(key, value) {
    //新的值如果存在,等同于get操作
    if(!this.get(key)){
        //超出最大值 队列最先的值要被替换
        if(this.keys.length >= this.max) {
            let changedDevice = this.cache[this.keys[0]]
            
            //和业务dom有关的逻辑: 当发生覆盖之后 将dom和index赋值
            value.ref = changedDevice.ref
            value.refIndex = changedDevice.refIndex

            this.cache[this.keys[0]] = null
            this.keys.shift()
        } 
        this.cache[key] = value
        this.keys.push(key)
    }
}

LRUCache.prototype.get = function(key) {
    let value = this.cache[key]

    //取已经存在的元素,将元素提到最后,
    if(value) {
        remove(this.keys, key)
        this.keys.push(key)
    }
    
    return value || null
}

function remove(arr, key) {
    let index = arr.indexOf(key)

    arr.splice(index, 1)
}

export default LRUCache
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值