我们在日常编码中,经常会用到缓存,而一个有效的缓存管理,也是大家必不可少的工具。而nodejs没有内置专用的缓存对象,并且由于js的作用域链的原因,很多变量使用起来容易出错,如果用一个通用的缓存管理起来,会方便很多,于是就手写了一个简单的nodejs缓存对象,并且可以指定变量保存时间。代码如下:
javascript
exports.cache = (function(){
function MyCatch(isClear){
var __cache = {};
var __clearable = !!isClear;
this.set = function(name, value, expireTime){
__cache['key_' + name] = {
expire: expireTime || 36000000, // 默认有效时间10小时, 36000000
expTime: (new Date()).getTime() + (expireTime || 36000000),
data: value
};
}
this.get = function(name) {
var che = __cache['key_' + name];
if(che && __clearable){
var now = (new Date()).getTime();
if(che.expTime < now ){
delete __cache['key_' + name];
che = null;
}else{
che.expTime = now + che.expire;
}
}
return che
}
this.del = function(name) {
delete __cache['key_' + name];
}
}
return new MyCatch(true);
})();
这个版本的缓存对象,是在用户取对象时,判断是否过期并消除过期对象。还有一个版本,采用setInterval方法自动消除过期对象,代码如下:
javascript
exports.cache = (function(){
function MyCatch(isClear){
var __cache = {};
this.set = function(name, value, expireTime){
__cache[name] = {
expire: expireTime || 900000, // 默认有效时间15分钟, 900000毫秒
expTime: parseInt((new Date()).getTime() / 1000, 10) + (expireTime || 900000),
data: value
};
}
this.get = function(name) {
var cache_value = __cache[name];
__cache[name] && (cache_value.expTime = parseInt((new Date()).getTime() / 1000, 10) + cache_value.expire);
return cache_value
}
this.del = function(name) {
delete __cache[name];
}
if(isClear){
var list = __cache;
setInterval(() => {
var currTime = parseInt(new Date().getTime / 1000, 10);
for(var key in list){
var che = list[key];
//
if(che.expTime == 0){
continue;
}
if(che.expTime < currTime ){
delete __cache[key];
}
}
}, 10000);
}
}
return new MyCatch(true);
})();
两种方法各有优缺点,大家可以根据个人喜好选择使用,或根据自己意愿修改。