我们通过 redis-cli 命令行和 RedisInsight 的 GUI 工具入门了 redis。
那在 Node 里怎么操作 redis 呢?
这就需要用 redis 的 node 的客户端了。
redis 有很多的 node 客户端的包:
最流行的就是 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();
这里执行 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');
执行以后是这样的:
所有的 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);
结果如下:
其他命令也是这样执行:
这些 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 {}
通过 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!';
}
}
因为 service 里加了 async、await,那 controller 里也得加一下:
这样就能在 nest 里操作 redis 了。
我们把它跑起来,浏览器访问下:
nest start --watch
可以看到控制台打印了 redis 命令的执行结果:
这就是在 Nest 里操作 redis 的方式。
案例代码在小册仓库:
总结
通过 redis 的 npm 包(redis、ioredis 等)可以连接 redis server 并执行命令。
如果在 nest 里,可以通过 useFactory 动态创建一个 provider,在里面使用 redis 的 npm 包创建连接。
redis 是必备的中间件,后面的项目实战会大量用到。