公司动态

MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第三章:NestJS 集成 Redis

📅 2026/7/15 14:40:28
MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第三章:NestJS 集成 Redis
一、为什么要在 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 连接使用ConfigServicenew Redis({ host: 127.0.0.1, port: 6379, password: 123456, });企业中一般不会写死而是读取.envREDIS_HOST127.0.0.1 REDIS_PORT6379 REDIS_PASSWORD123456五、封装 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.tsRedis 独立成模块方便复用。十二、本章总结知识点作用ioredisRedis 客户端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 连接和操作逻辑提高代码复用性降低耦合后续维护和扩展更加方便