如何为Flutter应用的Firebase可调用函数实现3小时缓存减少数据库调用?
为Firebase可调用函数实现3小时缓存方案
要给你的排行榜可调用函数设置3小时缓存、减少Firestore数据库调用,最直接的方式是在函数内实现基于Firestore的缓存逻辑(用Firestore存储缓存数据和过期时间),具体实现如下:
核心思路
- 在Firestore中创建专门的缓存文档,存储排行榜数据和过期时间戳
- 函数调用时优先检查缓存是否有效(当前时间未超过过期时间)
- 缓存有效则直接返回缓存数据,无效则重新查询数据库并更新缓存
修改后的函数代码
exports.getScores = functions .runWith({ enforceAppCheck: true, // 拒绝缺少或无效App Check令牌的请求 }) .https.onCall(async (data, context) => { console.log('enforceAppCheck'); const CACHE_COLLECTION = 'cache'; const CACHE_DOCUMENT = 'rankings'; const CACHE_DURATION = 3 * 60 * 60 * 1000; // 3小时对应的毫秒数 try { // 1. 读取缓存文档 const cacheDoc = await admin.firestore().collection(CACHE_COLLECTION).doc(CACHE_DOCUMENT).get(); if (cacheDoc.exists) { const cacheData = cacheDoc.data(); const now = Date.now(); // 2. 检查缓存是否未过期 if (now < cacheData.expireAt) { console.log('返回缓存数据'); return cacheData.scores; } } // 3. 缓存无效/不存在,查询数据库获取最新数据 const scoreQ = await admin.firestore().collection("players") .orderBy("score", "desc") .limit(7) .get(); const scores = scoreQ.docs.map((doc) => { return { player: doc.id, score: doc.data().score, level: doc.data().level, }; }); // 4. 更新缓存,设置过期时间为当前时间+3小时 await admin.firestore().collection(CACHE_COLLECTION).doc(CACHE_DOCUMENT).set({ scores: scores, expireAt: Date.now() + CACHE_DURATION }); console.log('返回最新数据库数据'); return scores; } catch (e) { functions.logger.log("error occured", e); throw new functions.https.HttpsError('internal', '获取排行榜数据失败', e); } });
关键说明
- 缓存存储:用Firestore的
cache/rankings文档保存缓存数据,你可根据需求调整集合和文档名称 - 过期时间:
CACHE_DURATION设为3小时对应的毫秒数,可灵活修改时长 - 错误处理:将原代码直接返回错误对象的逻辑,改为抛出标准
HttpsError,符合可调用函数规范,Flutter端能更友好地捕获处理 - Flutter端适配:无需修改现有调用代码,保持原有的Firebase可调用函数调用方式即可
可选优化方向
如果你的函数调用量极大,可考虑使用**Cloud Memorystore(Redis)**作为缓存介质,读取速度比Firestore更快,但配置和维护成本稍高,适合高并发场景。
内容的提问来源于stack exchange,提问作者Patola
相关产品推荐
相关产品推荐

