一个cache的设计
发布于 11 年前 作者 yakczh 4810 次浏览 最后一次编辑是 8 年前
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缓存版本

回到顶部