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

参考

相关推荐
前端李易安34 分钟前
Web常见的攻击方式及防御方法
前端
PythonFun1 小时前
Python技巧:如何避免数据输入类型错误
前端·python
hakesashou1 小时前
python交互式命令时如何清除
java·前端·python
天涯学馆1 小时前
Next.js与NextAuth:身份验证实践
前端·javascript·next.js
HEX9CF1 小时前
【CTF Web】Pikachu xss之href输出 Writeup(GET请求+反射型XSS+javascript:伪协议绕过)
开发语言·前端·javascript·安全·网络安全·ecmascript·xss
ConardLi1 小时前
Chrome:新的滚动捕捉事件助你实现更丝滑的动画效果!
前端·javascript·浏览器
ConardLi2 小时前
安全赋值运算符,新的 JavaScript 提案让你告别 trycatch !
前端·javascript
凌云行者2 小时前
使用rust写一个Web服务器——单线程版本
服务器·前端·rust
华农第一蒟蒻2 小时前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
积水成江2 小时前
关于Generator,async 和 await的介绍
前端·javascript·vue.js