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

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

相关推荐
Mr_li1 小时前
构建一个 NestJS 应用程序需要具备哪些基础元素?
node.js
UIUV4 小时前
AI Agent 开发实战:从原理到最小化实现
后端·langchain·node.js
2301_816997884 小时前
Webpack基础
前端·webpack·node.js
Qinana4 小时前
解构 LangChain Tool Calling:从 Schema 定义到 Agent 执行循环的深度解析
前端·javascript·node.js
難釋懷5 小时前
Redis消息队列-基于Stream的消息队列
数据库·redis·缓存
troublea5 小时前
Laravel 8.x新特性全解析
数据库·mysql·缓存
朝朝暮暮an6 小时前
Day 4|Node.js 文件系统、路径与进程管理
node.js
朝朝暮暮an6 小时前
Day 3|Node.js 事件循环 & 异步模型深入(Part 2,3)
node.js
rannn_1116 小时前
【Redis|基础篇】初识、Redis的安装与启动、Redis命令、Java客户端
java·redis·后端·缓存·nosql
FakeOccupational6 小时前
【有趣项目 Windows】浏览器缓存读取应用 chromecacheview 数据恢复+数字取证+调试网页
缓存