从Node/Express/Redis缓存已压缩的响应

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

也许express-view-cache很有用? - robertklep
谢谢Robert,看起来它做了我想要的事情,但作者说它还没有准备好用于生产环境,所以我不太愿意承诺使用它。我已经阅读了一些其他解决方案,他们建议将gzipped响应缓存到压缩缓冲区中,但我没有看到任何人这样做的示例。你能发表评论吗? - cgarvey
不确定“压缩缓冲区”是什么意思。如果您发布一些链接,我会查看它。 - robertklep
如果你看一下这个链接:https://dev59.com/CGjWa4cB1Zd3GeqPut3K,最后一个答案引用了zlib文档,其中有一条评论指出压缩响应是昂贵的,他们应该“缓存压缩缓冲区”。这就是我想知道的。非常感谢,Colm。 - cgarvey
好的,这意味着缓存压缩响应比缓存未压缩响应并在每次发送回客户端时进行压缩更有意义。无论如何,“express-view-cache”的“未准备好生产”警告似乎只与内存缓存部分有关,但它似乎也支持Redis(您已经在运行中)。 - robertklep
1个回答

4
我最近也遇到了类似的情况,我从MongoDB数据库接收到一个大的JSON负载,旨在发送给用户应用程序。
我只需要定期更新它,大约每10分钟更新一次,但是压缩响应需要很长时间,因此我定期获取数据,对其进行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);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接