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 在前后端开发工作中有着广泛的应用,我们需要熟练掌握。

参考

相关推荐
一天睡25小时18 小时前
做产品前,先别急着写代码:我是怎么判断一个点子值不值得做的
前端
霍理迪18 小时前
TS—函数、类、泛型
前端
cc.ChenLy18 小时前
浏览器缓存机制详解:如何彻底解决前端代码更新后的缓存问题
前端
XTTX11019 小时前
Vue3+Cesium电子围栏效果
前端·javascript·vue.js
KevinWang_19 小时前
AI 基础设施及其应用
前端
AIFarmer19 小时前
npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确, 然后再试一次。
前端·npm·node.js
小红的布丁19 小时前
Redis 集群详解:主从哨兵和切片集群有什么区别
前端·数据库·redis
小高00719 小时前
🔥前端性能内卷终点?Signals 正在重塑我们的开发习惯
前端·javascript·vue.js
周末也要写八哥20 小时前
HTML网页设计入门之“做前端”的基本思路
前端·html
VelinX20 小时前
【个人学习||vue】
前端·vue.js·学习