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

参考

相关推荐
敲敲了个代码4 小时前
从硬编码到 Schema 推断:前端表单开发的工程化转型
前端·javascript·vue.js·学习·面试·职场和发展·前端框架
dly_blog5 小时前
Vue 响应式陷阱与解决方案(第19节)
前端·javascript·vue.js
消失的旧时光-19436 小时前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
console.log('npc')6 小时前
Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果
前端·javascript·vue.js
用户47949283569156 小时前
React Hooks 的“天条”:为啥绝对不能写在 if 语句里?
前端·react.js
我命由我123456 小时前
SVG - SVG 引入(SVG 概述、SVG 基本使用、SVG 使用 CSS、SVG 使用 JavaScript、SVG 实例实操)
开发语言·前端·javascript·css·学习·ecmascript·学习方法
用户47949283569157 小时前
给客户做私有化部署,我是如何优雅搞定 NPM 依赖管理的?
前端·后端·程序员
C_心欲无痕7 小时前
vue3 - markRaw标记为非响应式对象
前端·javascript·vue.js
qingyun9897 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构
熬夜敲代码的小N7 小时前
Vue (Official)重磅更新!Vue Language Tools 3.2功能一览!
前端·javascript·vue.js