我在express中遇到了一些真正的麻煩緩存響應......我有一個端點獲得了很多請求(大約5k rpm)。這個端點從mongodb中獲取數據並加快速度我想緩存完整的json響應1秒,這樣每秒只有第一個請求會觸發數據庫,而其他請求則來自緩存。在express中緩存響應
當抽象出問題的數據庫部分時,我的解決方案看起來像這樣。我在redis中檢查緩存的響應。如果發現有人提供服務。如果沒有,我發送它,發送它並設置緩存。超時模擬了數據庫操作。
app.get('/cachedTimeout', function(req,res,next) {
redis.get(req.originalUrl, function(err, value) {
if (err) return next(err);
if (value) {
res.set('Content-Type', 'text/plain');
res.send(value.toString());
} else {
setTimeout(function() {
res.send('OK');
redis.set(req.originalUrl, 'OK');
redis.expire(req.originalUrl, 1);
}, 100);
}
});
});
問題是,這不僅會使第一個請求每秒都會觸發數據庫。相反,在我們有時間設置緩存之前(100毫秒之前)所有請求都會觸發數據庫。當真實負載增加到這個時候,真正的響應時間大約爲60秒,因爲很多請求都落後了。
我知道這可以通過像varnish這樣的反向代理來解決,但目前我們在heroku上託管,這使得這樣的設置變得複雜。
我想要做的是在express中做一些反向代理緩存。我希望它能夠在初始請求(生成緩存)之後發出的所有請求都會在使用相同響應之前等待緩存生成完成。
這可能嗎?