Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在express中缓存响应_Node.js_Mongodb_Caching_Heroku_Express - Fatal编程技术网

Node.js 在express中缓存响应

Node.js 在express中缓存响应,node.js,mongodb,caching,heroku,express,Node.js,Mongodb,Caching,Heroku,Express,我在express中缓存响应时遇到了一些实际问题…我有一个端点,它会收到很多请求(大约5k rpm)。这个端点从mongodb获取数据,为了加快速度,我希望将完整的json响应缓存1秒,以便每秒只有第一个请求命中数据库,而其他请求则从缓存中得到服务 当抽象出问题的数据库部分时,我的解决方案如下所示。我在redis中检查缓存响应。如果找到一个,我就为它服务。如果不是,我生成它,发送它并设置缓存。超时时间太长,无法模拟数据库操作 app.get('/cachedTimeout', function(

我在express中缓存响应时遇到了一些实际问题…我有一个端点,它会收到很多请求(大约5k rpm)。这个端点从mongodb获取数据,为了加快速度,我希望将完整的json响应缓存1秒,以便每秒只有第一个请求命中数据库,而其他请求则从缓存中得到服务

当抽象出问题的数据库部分时,我的解决方案如下所示。我在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中执行某种反向代理缓存。我希望在使用相同的响应之前,初始请求(生成缓存)之后传入的所有请求都将等待缓存生成完成


这可能吗?

在node.js应用程序上使用代理层。这是个不错的选择
要使用to.

p-throttle
应该完全满足您的需要: