(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; } })();