You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:12:11