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

如何为Flutter应用的Firebase可调用函数实现3小时缓存减少数据库调用?

为Firebase可调用函数实现3小时缓存方案

要给你的排行榜可调用函数设置3小时缓存、减少Firestore数据库调用,最直接的方式是在函数内实现基于Firestore的缓存逻辑(用Firestore存储缓存数据和过期时间),具体实现如下:

核心思路

  1. 在Firestore中创建专门的缓存文档,存储排行榜数据和过期时间戳
  2. 函数调用时优先检查缓存是否有效(当前时间未超过过期时间)
  3. 缓存有效则直接返回缓存数据,无效则重新查询数据库并更新缓存

修改后的函数代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:19