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

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

相关推荐
濮水大叔4 小时前
Cabloy/Vona 为什么不需要 NestJS 的 Dynamic Module
typescript·node.js·nestjs
威嵌神州5 小时前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
匠云创新6 小时前
读完一万段要两分钟:我们把标书读取从 WPS 对象模型搬到了 docx 解析
性能优化·node.js
某哈压力大14 小时前
SSH 突然 Connection reset?不是密钥坏了,是 OpenSSL 把 sshd 干趴了
前端·node.js·命令行
回眸&啤酒鸭15 小时前
【回眸】Node.js 新手从零到一实战指南
node.js
nice_lcj52015 小时前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
浪遏1 天前
recruitment-cli:让 AI 接手求职招聘,从架构到一次发送超时
架构·typescript·node.js
羑悻的小杀马特2 天前
Redis持久化三剑客:RDB二进制快照、AOF文本日志、混合模式如何守护你的数据安全?
数据库·redis·缓存·aof·持久化存储·rdb
时间的拾荒人2 天前
Redis 进阶实战:渐进式遍历、持久化机制与事务详解
数据库·redis·缓存