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 连接

使用 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 独立成模块,方便复用。


十二、本章总结

知识点作用
ioredisRedis 客户端
RedisModule管理 Redis 模块
RedisService封装 Redis 操作
Provider创建 Redis 实例
ConfigService管理 Redis 配置
Key 命名规范提高可维护性

本章一句话总结

企业项目不会直接在业务代码中操作 Redis,而是统一封装 RedisService,通过依赖注入实现 Redis 的统一管理和复用。


思考题(精简回答)

  1. 为什么企业推荐使用 ioredis,而不是每个地方都 new Redis()

    因为每个地方都 new Redis() 会创建多个连接,浪费资源且难维护,企业通常只创建一个 Redis 实例,通过依赖注入共享使用。

  2. 为什么 Redis 配置要放到 .env 中,而不能写死在代码里?

    因为不同环境(开发、测试、生产)的 Redis 地址不同,放到 .env 中方便配置,也避免敏感信息写死在代码里。

  3. RedisModule 和 RedisService 分别负责什么?
    RedisModule:负责创建和注册 Redis 实例。
    RedisService:封装 Redis 的常用操作(如 getsetdel),供业务调用。
  4. 为什么 Redis Key 要统一命名规范?
    提高可读性、避免 Key 冲突、方便管理和排查问题
  5. 如果用户模块、订单模块、登录模块都要使用 Redis,它们应该各自创建 Redis 连接,还是共用一个 Redis 实例?为什么?

    应该共用一个 Redis 实例,因为可以减少连接数量,节省资源,统一管理,维护成本更低。

  6. 为什么企业项目通常会把 Redis 封装成一个独立模块,而不是直接在每个业务模块中操作 Redis?
    因为独立模块可以统一管理 Redis 连接和操作逻辑,提高代码复用性,降低耦合,后续维护和扩展更加方便
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值