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

参考

相关推荐
清灵xmf1 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询
大佩梨1 小时前
VUE+Vite之环境文件配置及使用环境变量
前端
GDAL1 小时前
npm入门教程1:npm简介
前端·npm·node.js
小白白一枚1112 小时前
css实现div被图片撑开
前端·css
薛一半2 小时前
PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置
前端·javascript·vue.js
@蒙面大虾2 小时前
CSS综合练习——懒羊羊网页设计
前端·css
MarcoPage3 小时前
第十九课 Vue组件中的方法
前端·javascript·vue.js
.net开发3 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
**之火3 小时前
Web Components 是什么
前端·web components
顾菁寒3 小时前
WEB第二次作业
前端·css·html