一个简单封装的的nodejs缓存对象

我们在日常编码中,经常会用到缓存,而一个有效的缓存管理,也是大家必不可少的工具。而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);
})();

两种方法各有优缺点,大家可以根据个人喜好选择使用,或根据自己意愿修改。

相关推荐
ChineHe2 小时前
Redis数据类型篇002_详解Strings核心命令与存储结构
数据库·redis·缓存
ChineHe5 小时前
Redis数据类型篇001_数据类型梳理与选择指南
数据库·redis·缓存
musenh7 小时前
redis和jedis
数据库·redis·缓存
brave_zhao10 小时前
javaFx清空缓存动画特效
缓存
程序员爱钓鱼10 小时前
Node.js 编程实战:测试与调试 —— Mocha / Jest / Supertest 使用指南
前端·后端·node.js
廋到被风吹走10 小时前
【Spring】IoC容器深度解析:Bean生命周期与循环依赖三级缓存
java·spring·缓存
Knight_AL11 小时前
Redis ZSet 实现排行榜(支持分数相同按时间顺序排序)
数据库·redis·缓存
冴羽11 小时前
JavaScript Date 语法要过时了!以后用这个替代!
前端·javascript·node.js
冰冰菜的扣jio11 小时前
入门redis——让你的查询快到起飞
数据库·redis·缓存
论迹12 小时前
【Redis】-- key的过期策略
数据库·redis·缓存