nestjs.prisma.postgresql作为缓存
在 Nest.js 项目中使用 Prisma 和 PostgreSQL 作为缓存,而不是 Redis,虽然这不是传统意义上的缓存方案(因为 Redis 是专门为高性能缓存设计的),但如果你已经拥有 PostgreSQL 数据库,并且不希望引入额外的技术栈(如 Redis),这确实是一个可行的替代方案。
这种方法的主要优点是:
- 减少依赖: 不需要额外部署和管理 Redis 服务器。
- 统一数据源: 缓存数据和业务数据都在同一个 PostgreSQL 数据库中。
- 事务一致性: 如果你的缓存更新需要 与数据库中的其他操作保持事务一致性,PostgreSQL 可以提供。
主要缺点是:
- 性能: PostgreSQL 通常不如 Redis 快,尤其是在高并发读写场景下。磁盘 I/O 和事务开销会带来额外的延迟。
- 功能: 缺乏 Redis 提供的丰富数据结构(List, Set, Hash等)和高级功能(Pub/Sub, Lua脚本等)。
- 内存使用: PostgreSQL 是一个关系型数据库,它的内存占用通常比 Redis 更高。
- 可伸缩性: 垂直伸缩 PostgreSQL 比水平伸缩 Redis 更具挑战性。
实现思路:
- 创建缓存表: 在 PostgreSQL 中创建一个专门的表来存储缓存数据。
- Prisma 模型: 定义对应的 Prisma 模型。
- 缓存服务: 创建一个 Nest.js 服务来封装缓存的存取逻辑,包括 TTL(Time-To-Live,过期时间)管理。
- 后台清理: 实现一个定时任务来清理过期的缓存条目。
下面是详细的实现步骤:
1. 项目准备
确保你已经有一个 Nest.js 项目,并且已经配置好了 Prisma 连接到 PostgreSQL。
如果你还没有,可以快速搭建:
# 创建 Nest.js 项目
nest new my-postgres-cache-app
cd my-postgres-cache-app
# 安装 Prisma
npm install prisma @prisma/client
npx prisma init
# 修改 .env 文件,配置你的 PostgreSQL 数据库连接
# DATABASE_URL="postgresql://user:password@localhost:5432/mydatabase?schema=public"
# 修改 schema.prisma,设置 provider = "postgresql"
2. 创建 Prisma 模型和迁移
修改 prisma/schema.prisma 文件,添加一个 CacheEntry 模型:
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model CacheEntry {
// 缓存键,作为主键
key String @id
// 缓存值,使用 Json 类型可以存储任意结构的数据
value Json
// 过期时间,如果为 null 则永不过期
expiresAt DateTime? @map("expires_at")
// 创建时间
createdAt DateTime @default(now()) @map("created_at")
// 更新时间
updatedAt DateTime @updatedAt @map("updated_at")
@@map("cache_entries") // 数据库表名
}
然后,生成数据库迁移并应用:
npx prisma migrate dev --name create_cache_table
这会在你的 PostgreSQL 数据库中创建一个名为 cache_entries 的表。