【问题标题】:Caching gzipped responses from Node/Express/Redis缓存来自 Node/Express/Redis 的压缩响应
【发布时间】:2013-10-23 01:52:31
【问题描述】:

我的要求是每天生成可供多个用户访问的报告。 数据仅每 24 小时更改一次。 目前我使用 Node 从存储在 Redis 中的数据创建报告,并生成使用 Express 的 Compress() 方法压缩的响应。 创建和压缩这些响应大约需要 40 秒(响应大约是 4MB 的未压缩 JSON) 我的偏好是将这些响应缓存/存储在文件系统或内存中一段时间​​。 我不想为此实现 Varnish 或其他反向代理,所以任何人都可以提出另一种有效缓存响应的方法吗? 提前致谢。

【问题讨论】:

  • 也许express-view-cache 有用?
  • 谢谢罗伯特,这看起来就像我正在寻找的那样,但作者说它还没有准备好生产,所以我不愿意承诺它。我已经阅读了一些其他解决方案,他们建议将 gzipped 响应缓存在 Compressed Buffer 中,但我还没有看到任何人这样做的例子。你能评论一下吗?
  • 不确定“压缩缓冲区”是什么意思。如果您发布一些链接,我会看看它。
  • 如果你看at this link:,最后一个答案引用了 zlib 文档,其中有一条评论指出 gzipping 响应很昂贵并且它们应该是“缓存压缩缓冲区”。这就是我想知道的。非常感谢,科尔姆
  • 啊,对,这意味着缓存压缩响应比缓存未压缩响应并在每次将其发送回客户端时进行压缩更有意义。无论如何,express-view-cache 的“未准备好生产”警告似乎只与内存缓存部分有关,但它似乎也支持 Redis(您已经在运行)

标签: node.js caching express redis


【解决方案1】:

我最近不得不做一些类似的事情,我从 MongoDB 数据库接收到一个大型 JSON 有效负载,打算发送到用户应用程序。

我只需要定期更新它,大约每 10 分钟一次,但是 GZipping 响应需要很长时间,所以我定期抓取数据,gzip 并将其存储起来,在此示例中将其作为对 GET 的响应发送要求。

var zlib = require('zlib');
var Buffer = require('buffer').Buffer;
var express = require('express');
var app = express();

var yourData, cachedGzip;

// zlib performs gzip compression, passes payload to callback asynchronously
zlib.gzip(new Buffer(yourData)), function(err, data){
    cachedGzip = data
});

// Somewhere later in your app...
// Can now use the cached data for gzip responses, example route
app.get('/', function(req, res) {
  res.header('Content-Type', 'application/json');
  res.header('Content-Encoding', 'gzip');
  res.send(cachedGzip);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多