以下是我正在處理的問題。通過節點服務器上的多個API請求維護數據
客戶端需要使用API輪詢節點服務器以查找某些數據。爲了讓節點服務器響應,它需要一個數據集(從DB中讀取)。我想避免在每次調查中讀取數據庫。如何維護多個民意調查中的數據集?
如果這是可能的話,它會對服務器性能產生什麼影響。
以下是我正在處理的問題。通過節點服務器上的多個API請求維護數據
客戶端需要使用API輪詢節點服務器以查找某些數據。爲了讓節點服務器響應,它需要一個數據集(從DB中讀取)。我想避免在每次調查中讀取數據庫。如何維護多個民意調查中的數據集?
如果這是可能的話,它會對服務器性能產生什麼影響。
db查詢減少總是一個複雜的問題。我的解決方案是使數據庫查詢承諾,並緩存它,直到它過期。
例如:
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來存儲創建的promise,並給它一個expriation時間。
您可以使用內存中緩存。這個想法是,在訪問數據庫之前,請檢查緩存中是否存在請求的值。如果是 - 服務它。如果沒有 - 從數據庫中提取,保存並緩存並返回。
從內存中提供服務是您獲得最快速度。在那裏有節點的現有解決方案,如node-cache。