一、为什么要在 NestJS 中集成 Redis?
企业项目中,Redis 常用于:
- 缓存用户信息
- 缓存商品数据
- 保存 Token
- 验证码
- 排行榜
- 分布式锁
因此,NestJS 项目通常都会集成 Redis。
二、安装 Redis 客户端
目前主流客户端:
- ioredis(企业推荐) ✅
- redis(官方客户端)
安装:
pnpm add ioredis
三、创建 RedisModule
项目结构:
src
├── redis
│ ├── redis.module.ts
│ ├── redis.service.ts
│ └── redis.provider.ts
作用:
统一管理 Redis 连接,方便其他模块使用。
四、配置 Redis 连接
使用 ConfigService:
new Redis({
host: '127.0.0.1',
port: 6379,
password: '123456',
});
企业中一般不会写死,而是读取 .env:
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=123456
五、封装 RedisService
为什么要封装?
不要在每个 Service 中都写:
const redis = new Redis();
而是统一封装:
@Injectable()
export class RedisService {
constructor(
@Inject('REDIS_CLIENT')
private readonly redis: Redis,
) {}
get(key: string) {
return this.redis.get(key);
}
set(key: string, value: string) {
return this.redis.set(key, value);
}
del(key: string) {
return this.redis.del(key);
}
}
优点:
- 统一管理
- 易维护
- 易扩展
六、注册 Provider
{
provide: 'REDIS_CLIENT',
useFactory: () => {
return new Redis({
host: '127.0.0.1',
port: 6379,
});
},
}
作用:
让 NestJS 负责 Redis 实例的创建和注入。
七、在业务中使用 Redis
例如:
@Injectable()
export class UserService {
constructor(
private readonly redisService: RedisService,
) {}
async getUser() {
await this.redisService.set('user:1', 'Tom');
return this.redisService.get('user:1');
}
}
八、为什么企业推荐封装 RedisService?
不要这样:
UserService
↓
new Redis()
OrderService
↓
new Redis()
AuthService
↓
new Redis()
这样会:
- 重复创建连接
- 难以维护
- 配置分散
企业推荐:
RedisService
│
┌────┼────┐
│ │ │
User Order Auth
统一复用一个 Redis 客户端。
九、Redis 常用操作封装
除了 get()、set(),企业通常还会封装:
set(key, value, ttl)
get(key)
del(key)
exists(key)
expire(key, ttl)
incr(key)
decr(key)
这样业务层无需直接调用底层客户端。
十、Redis Key 管理规范
推荐:
user:1
user:token:1
product:100
article:10:like
order:1001
不要:
1
abc
test
统一命名便于维护。
十一、企业项目目录结构
src
├── modules
│ ├── user
│ ├── auth
│ ├── order
│
├── redis
│ ├── redis.module.ts
│ ├── redis.service.ts
│ └── redis.provider.ts
│
├── config
│
└── app.module.ts
Redis 独立成模块,方便复用。
十二、本章总结
| 知识点 | 作用 |
|---|---|
| ioredis | Redis 客户端 |
| RedisModule | 管理 Redis 模块 |
| RedisService | 封装 Redis 操作 |
| Provider | 创建 Redis 实例 |
| ConfigService | 管理 Redis 配置 |
| Key 命名规范 | 提高可维护性 |
本章一句话总结
企业项目不会直接在业务代码中操作 Redis,而是统一封装 RedisService,通过依赖注入实现 Redis 的统一管理和复用。
思考题(精简回答)
- 为什么企业推荐使用 ioredis,而不是每个地方都
new Redis()?因为每个地方都
new Redis()会创建多个连接,浪费资源且难维护,企业通常只创建一个 Redis 实例,通过依赖注入共享使用。 - 为什么 Redis 配置要放到
.env中,而不能写死在代码里?因为不同环境(开发、测试、生产)的 Redis 地址不同,放到
.env中方便配置,也避免敏感信息写死在代码里。 - RedisModule 和 RedisService 分别负责什么?
RedisModule:负责创建和注册 Redis 实例。
RedisService:封装 Redis 的常用操作(如get、set、del),供业务调用。 - 为什么 Redis Key 要统一命名规范?
提高可读性、避免 Key 冲突、方便管理和排查问题 - 如果用户模块、订单模块、登录模块都要使用 Redis,它们应该各自创建 Redis 连接,还是共用一个 Redis 实例?为什么?
应该共用一个 Redis 实例,因为可以减少连接数量,节省资源,统一管理,维护成本更低。
- 为什么企业项目通常会把 Redis 封装成一个独立模块,而不是直接在每个业务模块中操作 Redis?
因为独立模块可以统一管理 Redis 连接和操作逻辑,提高代码复用性,降低耦合,后续维护和扩展更加方便

657

被折叠的 条评论
为什么被折叠?



