面试题答案
一键面试缓存策略
- getStaticProps:
- 利用 Incremental Static Regeneration 特性,通过设置
revalidate
字段(例如revalidate: 60
,表示每 60 秒重新生成一次页面),在页面构建后定期重新生成静态页面,确保数据在一定时间内是最新的。 - 对于长期不变化的数据,可以使用 CDN 进行缓存,减少源服务器的负载。在构建过程中生成的静态文件可以由 CDN 分发,并且设置较长的缓存时间。
- 利用 Incremental Static Regeneration 特性,通过设置
- API Routes:
- 在服务器端,可以使用内存缓存(如 Node.js 中的
node-cache
库)。当 API 接收到请求时,先检查缓存中是否存在所需数据。如果存在,则直接返回缓存数据;如果不存在,再从数据库或其他数据源获取数据,并将其存入缓存,设置合适的过期时间。 - 对于频繁访问且数据变化不大的 API 端点,可以设置 HTTP 缓存头(如
Cache - Control
),告诉客户端和中间代理服务器如何缓存响应。例如,Cache - Control: public, max - age = 3600
表示允许公共缓存,缓存有效期为 1 小时。
- 在服务器端,可以使用内存缓存(如 Node.js 中的
重新验证机制
- getStaticProps 与 getServerSideProps:
- getStaticProps:如上述提到的
revalidate
机制,它在页面处于生产环境时,会在后台重新生成页面。这样可以在不影响用户体验的情况下,逐渐让页面数据更新。例如,一个新闻网站可以通过设置合适的revalidate
时间,让文章页面数据定期更新,保证时效性。 - getServerSideProps:每次请求页面时都会运行,能保证数据的实时性。但为了优化性能,可以结合缓存策略。例如,在获取数据前先检查缓存,缓存失效时再重新从数据源获取。同时,可以在特定场景下(如数据发生重要变化时),通过清除相关缓存来强制重新获取最新数据。
- getStaticProps:如上述提到的
- API Routes:
- 可以在数据源发生变化时,通过某种消息机制(如消息队列)通知 API 服务器清除相关缓存数据。例如,当数据库中的一条重要记录更新时,发送一条消息给 API 服务器,API 服务器接收到消息后清除对应的缓存,确保下一次请求能获取到最新数据。
- 对于缓存中的数据,可以设置一个较短的验证周期。在每次从缓存读取数据时,检查数据是否已经超过了验证周期,如果超过,则重新从数据源获取最新数据并更新缓存。