如何在Node.js中实现定时缓存以避免Google Sheets请求超限
Node.js 实现Google Sheets请求缓存方案
核心逻辑
通过内存存储上一次接口请求的返回数据、请求时间戳,每次调用数据拉取接口时先判断缓存是否在有效期内,有效期内直接返回缓存数据,仅当缓存过期时才向Google Sheets发起真实请求,同时增加并发锁避免同一时间多个请求重复触发接口调用。
实现步骤
- 安装依赖
使用Google官方Node.js SDK调用接口,执行以下命令安装:npm install googleapis - 封装带缓存的拉取函数
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
相关产品推荐
相关产品推荐

