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

如何在Node.js中实现定时缓存以避免Google Sheets请求超限

Node.js 实现Google Sheets请求缓存方案

核心逻辑

通过内存存储上一次接口请求的返回数据、请求时间戳,每次调用数据拉取接口时先判断缓存是否在有效期内,有效期内直接返回缓存数据,仅当缓存过期时才向Google Sheets发起真实请求,同时增加并发锁避免同一时间多个请求重复触发接口调用。

实现步骤

  1. 安装依赖
    使用Google官方Node.js SDK调用接口,执行以下命令安装:
    npm install googleapis
  2. 封装带缓存的拉取函数
const { google } = require('googleapis');

// 配置参数
const SHEET_ID = '你的Google表格ID';
const RANGE = 'Sheet1!A:Z'; // 按需替换为你要拉取的范围
const CACHE_TTL = 5 * 60 * 1000; // 缓存有效期5分钟,单位毫秒
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'];

// 缓存变量
let cachedData = null;
let lastFetchTime = 0;
let isFetching = false;
let requestQueue = [];

// 鉴权函数,按需替换为你自己的鉴权逻辑,比如用服务账号密钥
async function getAuthClient() {
  const auth = new google.auth.GoogleAuth({
    // 如果你用服务账号,这里填密钥文件路径,或者直接传credentials对象
    keyFile: 'service-account-key.json',
    scopes: SCOPES,
  });
  return auth.getClient();
}

// 真实拉取Google Sheets数据的逻辑
async function fetchSheetData() {
  const authClient = await getAuthClient();
  const sheets = google.sheets({ version: 'v4', auth: authClient });
  const res = await sheets.spreadsheets.values.get({
    spreadsheetId: SHEET_ID,
    range: RANGE,
  });
  return res.data.values;
}

// 对外暴露的带缓存的获取数据方法
async function getSheetData() {
  // 缓存未过期,直接返回
  if (Date.now() - lastFetchTime < CACHE_TTL && cachedData) {
    return cachedData;
  }

  // 如果已经有正在进行的拉取请求,加入队列等待结果
  if (isFetching) {
    return new Promise((resolve) => {
      requestQueue.push(resolve);
    });
  }

  // 缓存过期,发起新请求
  isFetching = true;
  try {
    cachedData = await fetchSheetData();
    lastFetchTime = Date.now();
    // 处理队列中等待的请求
    requestQueue.forEach(resolve => resolve(cachedData));
    requestQueue = [];
    return cachedData;
  } catch (err) {
    // 拉取失败如果有旧缓存可以降级返回旧缓存,避免业务报错
    if (cachedData) {
      requestQueue.forEach(resolve => resolve(cachedData));
      requestQueue = [];
      return cachedData;
    }
    // 没有旧缓存就抛出错误
    throw err;
  } finally {
    isFetching = false;
  }
}

module.exports = { getSheetData };

自定义调整说明

  • 可通过修改CACHE_TTL的值调整缓存有效期,比如要设置为10分钟,将值改为10 * 60 * 1000即可
  • 若需要多实例共享缓存、或进程重启后保留缓存,可将cachedData、lastFetchTime存储到Redis中,读写逻辑不变
  • 错误降级逻辑可按需调整,拉取失败时如果不需要保留旧缓存,删除对应降级分支即可

注意事项

  • 访问Google Sheets的账号需要提前获得对应表格的只读权限
  • 缓存机制可以大幅降低接口请求量,结合Google Sheets API默认每分钟300次的读配额,基本可以完全避免触达请求限制

内容的提问来源于stack exchange,提问作者erikmikoyan2003

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:30:04