我们通过 redis-cli 命令行和 RedisInsight 的 GUI 工具入门了 redis。
# 那在 Node 里怎么操作 redis 呢?
这就需要用 redis 的 node 的客户端了。
redis 有很多的 node 客户端的包 (opens new window):
最流行的就是 redis 和 ioredis 这两个。
我们创建个项目来试一下:
我们先试一下 redis,它是官方提供的 npm 包:
npm install redis
然后在代码里连接 redis 服务,并执行命令:
import { createClient } from "redis";
const client = createClient({
socket: {
host: "localhost",
port: 6379,
},
});
client.on("error", (err) => console.log("Redis Client Error", err));
await client.connect();
const value = await client.keys("*");
console.log(value);
await client.disconnect();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这里执行 keys 命令,获取所有的 key。
因为用到了 es module、顶层 await,这些的启用需要在 package.json 里添加 type: module
然后 node 执行下:
用 RedisInsight 看下:
确实现在是有这些 key。
我们再执行其他命令试试,比如 hset 创建一个 hash 表:
await client.hSet("guangguang1", "111", "value111");
await client.hSet("guangguang1", "222", "value222");
await client.hSet("guangguang1", "333", "value333");
2
3
执行以后是这样的:
所有的 redis 命令都有对应的方法:
和我们在命令行客户端里操作一样。
这样我们就完成了 node 里操作 redis 的功能。
再来试下 ioredis:
npm install ioredis
然后连接 redis server 并执行 keys 命令:
import Redis from "ioredis";
const redis = new Redis();
const res = await redis.keys("*");
console.log(res);
2
3
4
5
6
7
结果如下:
其他命令也是这样执行:
这些 node 包用起来还是很简单的,没啥学习成本。
# 🚀那 nest 里怎么操作 redis 呢?
其实也是一样的:
执行 nest new nest-redis 创建一个 nest 项目:
nest new nest-redis -p npm
# 当然,要先安装用到的 redis 的包。
npm install redis
# 然后在 AppModule 添加一个自定义的 provider:
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { createClient } from "redis";
@Module({
imports: [],
controllers: [AppController],
providers: [
AppService,
{
provide: "REDIS_CLIENT",
async useFactory() {
const client = createClient({
socket: {
host: "localhost",
port: 6379,
},
});
await client.connect();
return client;
},
},
],
})
export class AppModule {}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
通过 useFactory 的方式动态创建 provider,token 为 REDIS_CLIENT。
# 然后注入到 service 里用就好了:
import { Inject, Injectable } from '@nestjs/common';
import { RedisClientType } from 'redis';
@Injectable()
export class AppService {
@Inject('REDIS_CLIENT')
private redisClient: RedisClientType;
async getHello() {
const value = await this.redisClient.keys('*');
console.log(value);
return 'Hello World!';
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
因为 service 里加了 async、await,那 controller 里也得加一下:
这样就能在 nest 里操作 redis 了。
我们把它跑起来,浏览器访问下:
nest start --watch
可以看到控制台打印了 redis 命令的执行结果:
这就是在 Nest 里操作 redis 的方式。
案例代码在小册仓库:
node 操作 redis (opens new window)
nest 操作 redis (opens new window)
# 总结
通过 redis 的 npm 包(redis、ioredis 等)可以连接 redis server 并执行命令。
如果在 nest 里,可以通过 useFactory 动态创建一个 provider,在里面使用 redis 的 npm 包创建连接。
redis 是必备的中间件,后面的项目实战会大量用到。