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