Nest探索(十二)在 Nest 中操作 Redis

💥 在掘金写技术好文,瓜分万元现金大奖 | 5月金石计划

前言

在上一篇文章Nest探索(十一)Redis 入门中,我们通过 redis-cli 命令行的方式学习了 Redis 的基础语法和操作方法,也就是介绍了 Redis 的安装配置,以及设置端口、密码、过期时间等,还介绍了 string、list、hash、set、sortedSet 等数据类型。

那么在 Node 应用中以及在 Nest 应用中怎么操作 Redis 呢?本文会试着介绍这方面的内容,以及在 Nest 中引入 Redis 内存数据库时踩坑的地方。

ioredis demo

Redis 中常用的 Node 客户端有 redis 和 ioredis。前者是 redis 官方开发并维护的开源项目,后者是国内开发者 luin 开发的开源项目,在今年3月该项目被 Redis 公司官方给收购了,Github上也能看到该项目已经被迁移至 Redis 官方旗下了。luin 老哥也算是从此走上人生巅峰了... 🙈

ioredis 支持 Cluster, Sentinel, Streams, Pipelining, Lua scripting, Redis Functions, Pub/Sub 等,在实践中用起来很方便。本文使用的正是 ioredis(当然也可以使用官方的 redis)。

首先,新建一个 Nodejs 项目:

bash 复制代码
mkdir ioredis-demo-240607
cd ioredis-demo-240607
pnpm init

pnpm i ioredis

新建 index.js 文件:

js 复制代码
import Redis from "ioredis"

const redis = new Redis()

const res = await redis.keys('*')

console.log(res)

我们执行 node index.js就可以打印出所有的key值了。

需要注意的是,这里 Redis 默认使用的是 6379 端口,如果要自定义端口并使用设置的密码,可以增加传参:

js 复制代码
const redis = new Redis(6379, '127.0.0.1', {
  password: '123'
})

nest demo

那么在 nest 中怎么操作 Redis 呢?

首先,我们新建一个 nest 项目,指定包管理器为 pnpm:

bash 复制代码
nest new nest-ioredis-demo-240607 -p pnpm
cd nest-ioredis-demo-240607
pnpm run start

接着,安装必需的 ioredis 依赖包:

bash 复制代码
pnpm i ioredis

接着,在 AppModule 中添加一个自定义的 provider:

ts 复制代码
// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
// @ts-ignore
import Redis from "ioredis"

@Module({
  imports: [],
  controllers: [AppController],
  providers: [
    AppService,
    {
      provide: 'REDIS_CLIENT',
      useFactory() {
        const client = new Redis(6379, '127.0.0.1', {
          password: '123'
        })
        return client
      },
    }
  ],
})
export class AppModule {}

需要注意的是,这里我们动态创建了一个 provider ,也就是 Factory 类型的 provider。我们通过在 provide 属性中定义了注入的 token,并在 useFactory 函数中返回要注入的 provider 的实例。

然后,通过 @Inject('REDIS_CLIENT') 的方式将 redis 实例注入到 service 里面:

ts 复制代码
// app.service.ts
import { Injectable, Inject, } from '@nestjs/common';
// @ts-ignore
import { RedisClientType } from 'ioredis';

@Injectable()
export class AppService {
  @Inject('REDIS_CLIENT')
  private redisClient: RedisClientType

  async getHello() {
    const value = await this.redisClient.keys('*n*');
    console.log(value);

    return 'Hello World!';
  }
}

相应的,由于我们使用了 async ,因此在 controller 中对应的方法上,返回值类型要改为 Promise<string>

ts 复制代码
// app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): Promise<string> { //
    return this.appService.getHello();
  }
}

至此,我们成功地在 Nest 应用中引入了 Redis。

最后,把代码跑起来测试一下:

bash 复制代码
pnpm start:dev

浏览器访问 http://localhost:3000/ ,可以看到:Hello World!

此时,可以看到控制台打印了 Redis 命令的执行结果:[ 'num', 'name' ]

后记

本文介绍了如何在 Node 应用中以及在 Nest 应用中引入和操作 Redis。在一个 Nest 应用中,我们是通过动态创建 provider 的方式引入 ioredis 的,这样可以方便地将 Redis 注入到 service 和 controller 中。此外,我们也可以使用官方的 redis 包去引入。

总的来说,Redis 在前后端开发工作中有着广泛的应用,我们需要熟练掌握。

参考

相关推荐
CappuccinoRose38 分钟前
模块化体系
前端·import·export·es modules
AIDANHANG1 小时前
放开靠时间戳对日志前先核请求ID跨服务传播与采样关联
前端·人工智能
半生过往3 小时前
前端学 Java 课程笔记
java·前端·笔记
广州华水科技3 小时前
2026年单北斗GNSS变形监测系统推荐,破解水库安全监测难题
前端
独爱香菜4 小时前
Next.js 15 + Cloudflare Workers 实战:零中间件多语言 SEO 站点架构
前端
计算机魔术师4 小时前
DeepSeek、Qwen3比肩GPT-5,本地跑大模型的时代来了
前端
xcyxiner4 小时前
flutter wsl2安装记录(使用宿主机虚拟机)
前端·flutter
前端炒粉4 小时前
长会话虚拟滚动与渲染优化
前端·javascript·vue.js
花归去4 小时前
ant的a-table更改表格的高度
前端·javascript·html
sibylyue5 小时前
基于 Vben Admin 框架的 Vue 3 前端项目配置文件及常用命令
前端·javascript·vue.js