js CacheQueue

(function(){

    var CacheQueue=function(name,weightValue,maxLength,clearTimerTime){

        //public

        this.name = name; //缓存器名称

        this.maxLength = maxLength || 10000; //队列最大长度        

        this.clearTimerTime = clearTimerTime || 1000 * 60 * 10 ; //十分钟清一次队列

        this.weightValue = weightValue ||  0.6; //权重值,算出来低于这值的记录都清除

        //private

        this.pointer = 0;    //当前队列指针

        this.lastClearTime = 0; //最后一次清空缓存队列时间    

        this.queue = {};    //数据

    }

    

    /**添加数据*/

    CacheQueue.prototype.add=function(data){

        if(this.pointe>=this.maxLength){

            //clear

            this.clearTimer();            

        }

        data.lastTime=new Date().getTime();

        data.readNum=0;

        

        var id=data.id;

        this.queue[id]=data;

        this.pointer++;

    }

    

    /**清理数据处理器*/

    CacheQueue.prototype.clearTimer=function(){      

        var now=new Date().getTime();

        for(var key in this.queue){

            var obj= this.queue[key];            

            if(this.getWeight(obj,now)<this.weightValue){

                this.pointer--;

                delete this.queue[key];

            }                

        }

        this.lastClearTime = new Date().getTime();

    }

    

    

    /**添加数据*/

    CacheQueue.prototype.remove=function(data){        

        var id=this.getId(data);

        if(this.queue[id]!=null){

            this.pointer--;

            delete this.queue[id];

        }

    }

    

    

    

    /**find2Id数据*/

    CacheQueue.prototype.findOne=function(data){     

        var id=this.getId(data);

        if(this.queue[id]==null){

            return null;

        }

        var obj=this.queue[id];

        this.queue[id].readNum++;

        this.queue[id].lastTime=new Date().getTime();

        return obj.data;    

    }

    

    /**查询数据 数组是引用的注意*/

    CacheQueue.prototype.findList=function(conditionCallback){

        var ar=[];

        for(var k in this.queue){

            var value=this.queue[k].data;

            if(conditionCallback(value,k)){

                this.queue[k].readNum++;

                this.queue[k].lastTime=new Date().getTime();

                ar.push(value);

            }

        }

        return ar;            

    }

    

    /**查找ID***/

    CacheQueue.prototype.getId=function(data){        

        if(typeof  data =="object"){

            if(data['id']!=null){

                return data['id'];

            }else{

                //TODO error

            }

         }

         return data;

    }

    

    /**权重算法

        设计思路: 1天内 大于多少次访问 最高数值是多少 如1天内 0.6得分至少访问 5次

        然后算出 最大天内最少访问次数,最低值是多少 如 10天内总访问==10次的就得分为 0.2

    ***/

    CacheQueue.prototype.getWeight=function(obj,now){    



         var tmp = now - obj.lastTime;

        if(tmp==0){

            tmp=1;

        }

        var day = Math.ceil(86400000/tmp);    //总天 

        var dv = obj.readNum || 0;     //总访问数        

                

        var t = 0.7* ( 86400000 / tmp) ; //时间影响 时间越少,占比越大        

        var n = 0.3* ( dv / (5*day *0.7))  ;    //访问次数影响 访问次数越多,占比越大

        var weight = t+n ;        

        

        return weight;

    }

    

})();

 

你可能感兴趣的:(cache)