如何在Redis中缓存图片和PDF?Node.js实现报错如何解决
问题解答
直接报错的修复方案
你当前抛出的ReferenceError: Busboy is not defined错误是依赖未引入导致的,按两步修复即可:
- 安装busboy依赖:
npm install busboy
- 在代码顶部引入busboy:
const Busboy = require('busboy');
现有代码的隐藏问题
修复上述错误后,你的缓存逻辑依然无法正常运行,还存在以下问题:
- Buffer拼接逻辑错误:
Buffer.concat()会返回新的Buffer实例,现有代码中fileData.concat([data])没有赋值给fileData,最终只会存储第一块分片数据,导致缓存的文件损坏,需要修改为:fileData = Buffer.concat([fileData, data]); - 存取缓存的key不一致:存入Redis时用的key前缀是
files,读取时用的是file,单复数拼写错误,永远读取不到已缓存的内容 - Redis二进制存取配置缺失:旧版本Node Redis客户端默认会将值转为字符串存储,存取二进制文件需要显式指定编码,存入时第三个参数传入
'BUFFER',读取时也指定返回Buffer格式,否则会出现文件转码损坏的问题
该实现方案的合理性
用Redis缓存图片、PDF这类二进制文件的逻辑是完全可行的,Redis的字符串类型最大支持512MB的单值存储,完全覆盖常规的图片、PDF文件大小,适合对热点小文件做缓存降低回源耗时。但不建议用Redis缓存超过100MB的大文件,内存成本过高性价比低。
其他可行的服务端缓存方案
- 本地文件系统缓存:将拉取到的文件直接存在Node服务本地磁盘,请求时先校验本地是否存在对应文件,不存在再回源拉取,实现简单成本低,适合单节点部署场景
- Nginx proxy_cache缓存:在Node服务前部署Nginx,使用Nginx原生的proxy_cache模块直接缓存octet-stream类型的响应,无需修改业务代码,缓存命中率高,维护成本低
- CDN缓存:如果文件允许公开访问,直接接入CDN服务,由CDN自动完成缓存、回源、过期清理逻辑,边缘节点响应速度远高于自建服务缓存,适合生产环境大规模使用
内容的提问来源于stack exchange,提问作者V Aruna
相关产品推荐
相关产品推荐

