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

在Next.js 13(App Router)中,直接调用数据库时如何实现数据缓存?

如何在Next.js 13服务组件中缓存getCategorias的数据库查询结果

当然可以缓存,Next.js 13 App Router针对直接数据库查询的场景,有几种实用的缓存方案:

1. 使用Next.js官方缓存工具函数

Next.js提供了专门用于缓存异步函数结果的工具,你可以直接包装getCategorias:

先导入cache函数:

import { cache } from 'next/cache'

然后改造getCategorias,用cache包裹查询逻辑:

const getCategorias = cache(async () => {
  // 这里写你的数据库查询代码(比如Prisma、MySQL驱动调用等)
  const data = await db.categorias.findMany()
  return data
})

这样getCategorias的结果会自动存入Next.js数据缓存,默认永久有效。如果需要定时刷新,可配置失效时间:

// 每60秒刷新一次缓存
const getCategorias = cache(async () => {
  const data = await db.categorias.findMany()
  return data
}, { revalidate: 60 })

2. 利用服务组件的静态缓存特性

Next.js 13的服务组件默认是静态渲染的,只要组件里没有使用headers()、cookies()这类动态依赖,Next.js会在构建时自动缓存组件的数据和渲染结果。

也就是说,只要getCategorias不依赖用户请求的动态数据,部署后首次查询的数据库结果会被缓存,后续请求直接复用缓存。如果需要更新缓存,可在页面/组件上配置revalidate属性:

export const revalidate = 3600 // 每1小时刷新一次缓存

export default async function Home() {
  const categorias = await getCategorias()
  // ... 组件渲染逻辑
}

3. 自定义缓存(内存/Redis)

如果需要更灵活的缓存规则,可在getCategorias内部实现自定义缓存逻辑。比如内存缓存(注意:仅单服务器进程有效,多实例部署建议用Redis):

let cachedCategorias = null
let cacheExpiry = 0

const getCategorias = async () => {
  const now = Date.now()
  // 检查缓存是否存在且未过期(示例设为5分钟)
  if (cachedCategorias && now < cacheExpiry) {
    return cachedCategorias
  }

  // 缓存失效,重新查询数据库
  const data = await db.categorias.findMany()
  cachedCategorias = data
  cacheExpiry = now + 5 * 60 * 1000 // 5分钟后过期
  return data
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:21:08