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

能否通过getServerSideProps首次从缓存获取数据?

关于getServerSideProps首次请求直接读取缓存的实现问题

不行,单纯依赖getServerSideProps本身无法实现首次请求直接从缓存获取数据。

原因很明确:getServerSideProps的执行逻辑是每次用户请求都会在服务器端重新运行,首次请求时,无论是浏览器缓存还是服务器端的缓存层都没有对应的数据,必然要执行API调用获取数据后,才能生成页面并被缓存下来供后续请求复用。你当前设置的Cache-Control响应头只是告诉缓存层(CDN、浏览器)缓存已生成的页面内容,但无法跳过首次的API调用步骤。

实现首次请求也能读取缓存的解决方案

要达成这个需求,你需要在服务器端额外搭建一层缓存机制(比如内存缓存、Redis等),提前把API数据缓存起来,这样首次进入getServerSideProps时就能直接读取缓存数据。以下是基于内存缓存的代码示例:

// 服务器端内存缓存,仅在当前进程生命周期内有效
let projectCache = null;
let cacheExpiry = 0;

export async function getServerSideProps({ req, res }) {
    const now = Date.now();
    // 检查缓存是否存在且未过期
    if (projectCache && now < cacheExpiry) {
        res.setHeader(
            'Cache-Control',
            'public, max-age=1800, stale-while-revalidate=59'
        );
        return {
            props: {
                data: projectCache
            },
        };
    }

    // 缓存失效或不存在时,调用API获取数据
    const resq = await fetch(`${process.env.NEXT_APP_API_URL}/get-project?page=index`);
    const data = await resq.json();
    
    // 更新缓存及过期时间(与Cache-Control的max-age保持一致)
    projectCache = data || "null";
    cacheExpiry = now + 1800 * 1000;

    res.setHeader(
        'Cache-Control',
        'public, max-age=1800, stale-while-revalidate=59'
    );

    return {
        props: {
            data: projectCache
        },
    };
}

注意事项

  • 内存缓存仅适用于单服务器实例部署场景,如果是多实例集群,需要使用Redis这类分布式缓存来保证不同实例间的缓存一致性
  • 缓存过期时间建议和Cache-Control的max-age保持一致,避免出现页面缓存与数据缓存不一致的问题
  • 若需要支持数据实时更新,可以结合stale-while-revalidate的逻辑,在后台异步更新缓存,不阻塞用户的当前请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:47:45