解释:这个标题简洁明了地传达了文章的核心内容,即通过缓存技术将API性能提升了50%,同时保留了原标题中的兴奋感(🚀表情符号),符合中文的表达习惯。
前几天,我注意到我的一些API端点变慢了点儿。原本只需400毫秒的请求,开始延长到800毫秒甚至更久。这听起来或许不算大问题,但在高流量的应用中,每一毫秒都至关重要。
我仔细研究了这个问题,发现了一些关键问题:
✅ 对相同的数据进行了重复的数据库查询。
✅ 高流量导致不必要的计算量。
✅ 没有设置缓存,每次请求都从新获取数据。
为解决这个问题,我采用了三种缓存策略,将响应时间减少了50%。下面我来说明一下具体是如何实现的。
1. 基于内存的缓存技术:使用 Redis 进行内存缓存首先,我增加了Redis缓存来存储频繁访问的数据。不再每次都直接访问数据库,而是将结果存储在Redis中,并设置了TTL(生存时间)。
🔹 NestJS 集成部分:介绍如何将 NestJS 集成到项目中.
import { CacheModule } from '@nestjs/cache-manager';
@Module({
imports: [
CacheModule.register({
store: 'redis',
host: 'localhost',
port: 6379,
ttl: 60 * 5, // 缓存5分钟(生存时间:Time To Live)
}),
],
})
🔹 从 Redis 获取数据并存储数据
@Injectable()
export class MyService {
constructor(@Inject(CACHE_MANAGER) private cacheManager: Cache) {}
async getData(id: string): Promise<any> {
const cachedData = await this.cacheManager.get(id);
if (cachedData) return cachedData;
const freshData = await this.databaseQuery(id); // 长时间查询
await this.cacheManager.set(id, freshData, { ttl: 300 }); // 设置缓存过期时间为300秒
return freshData;
}
}
成果:经常被访问的数据的数据库查询减少了多达60%。
2. 使用 Next.js 的 ISR 和 SWR 进行客户端缓存技术
接下来我们要做的是利用Next.js的缓存功能来减少那些不必要的后端请求。
🔹 增量静态生成 (ISR) 用于缓存 API 响应:
export async function getStaticProps() {
const data = await fetchData();
return { props: { data }, revalidate: 300 }; // 缓存时间为5分钟
}
🔹 客户端缓存中的 SWR(过时验证缓存策略):
我们使用了 useSWR
这个函数从 /api/data
这个 API 地址获取数据,并且设置了每5秒刷新一次。在这里,fetcher
是用来处理实际的 HTTP 请求的函数,data
存储获取到的数据,而 error
存储可能出现的错误。
后端请求减少了 40%,同时确保数据保持新鲜。
3. 使用 Prisma 进行数据库查询优化即使使用了缓存,仍然有一些查询是必要的。为了使这些查询更快,我:
🔹 利用索引来 优化常见查询。
🔹 实现了分页 来避免加载不必要的记录。
🔹 利用了 Prisma 的查询缓存功能 来减少重复操作。
const users = await prisma.user.findMany({
take: 50, // 每次只取50个用户
skip: 100, // 实现分页功能
});
结果: 通过优化索引和分页,查询速度快了一倍!
影响如下:更快速的 API,更开心的用户实施了这些缓存策略后,我看到了:
✔️ API响应时间从约800毫秒降至约350毫秒,达到50%的改进。
✔️ 由于Redis和客户端缓存,数据库负载减轻了。
✔️ 更快的API响应和预加载数据带来了更好的用户体验。
缓存绝不仅仅是提升性能——它真的是一项颠覆性的技术! 如果你正在使用 NestJS + Next.js ,添加 Redis、ISR、SWR 以及数据库优化可以使你的应用大为不同。
👉 你以前优化过 API 性能吗?你觉得哪种方法最有效?咱们来聊聊吧!
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章