node.js如何避免在高并发时缓存恰好失效时大量查询数据库?
场景: 当缓存不存在的时候,从数据库中获取并保存在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";
});
}
};