在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
相关产品推荐
相关产品推荐

