如何在使用ioredis存储数据时避免JSON序列化与反序列化
避免Redis存储API响应时的序列化/反序列化内存问题
可行方案
- 直接存储Buffer格式:axios请求时设置
responseType: 'arraybuffer',拿到响应的原始Buffer后直接存入Redis,跳过JSON序列化步骤。读取时先获取Buffer,再按需反序列化(如果需要使用结构化数据)。这样把大对象的序列化开销转移到了实际使用数据的时机,而非缓存读写阶段。// 请求获取原始Buffer const response = await axios.get('/large-api', { responseType: 'arraybuffer' }); // 存入Redis await redis.set('cache:large-data', response.data); // 读取缓存 const buffer = await redis.getBuffer('cache:large-data'); // 按需反序列化 const data = JSON.parse(buffer.toString()); - 拆分数据到Redis哈希表:把包含25000个对象的大数组拆分成多个小分片,分别存入Redis哈希结构的不同字段中。读写时只处理部分分片,避免一次性加载整个大数组到内存。
// 拆分存储大数组 const largeArray = response.data; const chunkSize = 1000; const hashKey = 'cache:large-data:chunks'; for (let i = 0; i < largeArray.length; i += chunkSize) { const chunk = largeArray.slice(i, i + chunkSize); await redis.hset(hashKey, `chunk-${Math.floor(i/chunkSize)}`, JSON.stringify(chunk)); } // 按需读取分片 const chunk = await redis.hget(hashKey, 'chunk-0'); const partialData = JSON.parse(chunk); - 用Redis Streams存储单条数据:如果API响应的数据是可逐条处理的,直接把每个对象单独存入Redis Streams,避免一次性序列化整个大数组。读取时按批次拉取数据,降低内存占用。
- 替换高效序列化库:如果必须使用JSON序列化,用
fast-json-stringify、msgpackr这类性能更优的库替代原生JSON.stringify/JSON.parse,它们处理大数组时内存消耗更低、速度更快。
核心思路
避免一次性将整个大对象加载到内存并完成序列化/反序列化,要么直接存储原始二进制延迟处理,要么拆分数据分散内存压力,或是用更高效的工具降低序列化过程的内存开销。
内容的提问来源于stack exchange,提问作者Chandrika
相关产品推荐
相关产品推荐

