一个简单封装的的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);
})();

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

相关推荐
RoyLin4 小时前
TypeScript设计模式:迭代器模式
javascript·后端·node.js
-Xie-8 小时前
Mysql杂志(十六)——缓存池
数据库·mysql·缓存
七夜zippoe8 小时前
缓存与数据库一致性实战手册:从故障修复到架构演进
数据库·缓存·架构
前端双越老师8 小时前
2025 年还有前端不会 Nodejs ?
node.js·agent·全栈
weixin_456904278 小时前
跨域(CORS)和缓存中间件(Redis)深度解析
redis·缓存·中间件
人工智能训练师16 小时前
Ubuntu22.04如何安装新版本的Node.js和npm
linux·运维·前端·人工智能·ubuntu·npm·node.js
Seveny0716 小时前
pnpm相对于npm,yarn的优势
前端·npm·node.js
MarkHard12317 小时前
如何利用redis使用一个滑动窗口限流
数据库·redis·缓存
心想事成的幸运大王19 小时前
Redis的过期策略
数据库·redis·缓存
huangql52021 小时前
npm 发布流程——从创建组件到发布到 npm 仓库
前端·npm·node.js