node.js如何避免在高并发时缓存恰好失效时大量查询数据库?
发布于 8 年前 作者 sigoden 4126 次浏览 来自 问答

场景: 当缓存不存在的时候,从数据库中获取并保存在cache里,如果存在从cache里获取,每天10点必须更新一次,其他时间点缓存两个小时更新一次。 导致10点的时候有很多并发请求同时过来,然后就会导致很多的sql查询操作,理想的逻辑是,只有一个请求会去数据库获取,其他都是从缓存中获取数据。 问题: 像golang或者java可以通过在从数据读取到缓存的那段代码前面加上锁,来保证在并发的情况下只会有一个请求是从数据库里获取数据,其他都是从缓存中获取。nodejs如何实现呢?

2 回复

@JacksonTian 《深入浅出NodeJS》里面有一段防止雪崩的代码片段,利用事件once添加多listener来实现(Page.77)

我还是把代码贴上来吧:

var proxy = new events.EventEmitter();
var status = "ready";
var select = function (callback) {
  proxy.once("selected", callback);
  if (status === "ready") {
    status = "pending";
    db.select("SQL", function (results) {
      proxy.emit("selected", results);
        status = "ready";
      });
   }
};
回到顶部