一个cache的设计
发布于 2年前 作者 yakczh 1022 次浏览
var cache = {};
function getCache(key, dep) {

    if (cache[key] == undefined) {

        dep.call(null,function(err, list) {

            cache[key] = list;

        });
        return cache[key];
    } else {

        return cache[key];
    }
}


var data = getCache("aa",
function(cb) {
    BlogModel.find({}, cb);
   
});

console.log(data);
```
本来是根据key去cache中查找,如果找不到,就执行BlogModel查数据然后放在cache中,因为异步的原因返回是undefined,但如果在cb写在getCache调用的代码里,嵌套就太深了,而且代码都一样,看有没有更好的办法
5 回复
var cache = {};
function getCache(key, dep, callback) {
  if (!cache.hasOwnProperty(key)) {
    dep.call(null,function(err, list) {
      cache[key] = list;
      callback(null, list);
    });
  } else {
    callback(null, cache[key]);
  }
}

getCache("aa", function (cb) {
  BlogModel.find({}, cb);
}, function (err, data) {
  console.log(data);
});

学习了,改装一下 就可以弄成redis缓存的那种样子。

我的页面上有多块缓存的数据,依次读出来一起render一个模板,如果写成回调的话, 两部分数据没法写个一个回调里面render一个模板的

不行的,object 的key 一多,性能马上就下去了。玩玩还可以,实际千万别这么搞。

var redis = require('redis');
var client = redis.createClient();


var cache = {}

cache.getKey = function(key, callback){
  client.get(key, callback);
};

cache.setKey = function(key, val, callback){
    client.set(key, val, function(err){
        callback(err, val);
    });
}

var getCache = function(key, dep, callback){
    cache.getKey(key, function(err, replies){
        if(err) return callback(err);

        if(!replies) {
            dep.call(null, function(err, val){
                if(err) return callback(err);
                cache.setKey(key, val, callback);
            });
        } else {
            return callback(err, replies);
        }
    });
}

getCache('aa', function(cb){
    cb(null, '123')

},function(err, data){
    console.log(data);
});

redis缓存版本

回到顶部