这是我正在处理的问题。
客户端需要使用API在节点服务器上轮询某些数据。要使节点服务器响应,它需要一个数据集(从DB读取)。我想避免在每次民意调查中阅读数据库。如何在多个民意调查中维护数据集?
如果可行,它是否会对服务器性能产生任何影响。
答案 0 :(得分:0)
db query reduction总是一个复杂的问题。我的解决方案是让db查询一个promise并将其缓存直到它过期。
例如:
var cache = {};
var cachedQuery = function(id) {
if(id in cache) return cache[id];
return cache[id] = new Promise(function(resolve, reject) {
db.query('select * from test where id=?', id, function(err, rows) {
delete cache[id];
if(err) reject(err);
else resolve(rows);
}
});
}
假设您在共享相同请求ID的同时有100多个查询,这些查询将共享相同的数据库请求。在第一个查询到来时建立请求,并且在查询完成时所有查询都将返回相同的结果。
对于更通用的用法,您可以使用lru-cache来存储创建的promises,并为其提供一个expriation时间。
答案 1 :(得分:0)
您可以使用内存缓存。我们的想法是,在访问数据库之前,检查缓存中是否存在请求的值。如果是 - 服务它。如果不是 - 从数据库中获取,保存到缓存并返回它。
从内存中获取是您能获得的最快速度。现有节点的解决方案,如node-cache。