Nest.js 系列——在 Nest.js 中使用 Redis

2,119 阅读4分钟

前言

一般在后端业务开发中,不可避免的肯定是要用 redis 的,比如缓存,比如消息队列等等。那么 redis 的作用是什么?在 nest 中如何使用 redis 呢?本文将会介绍如何在 nest 中使用 redis。

为什么要用 redis

在后端业务的数据存储中,一般大多是使用 mysql 数据库来进行数据存储。但是 mysql 的数据是存在硬盘中的,而硬盘的读写速度是比较慢的,所以在一些对性能要求比较高的场景下,就需要使用 redis 来进行数据存储了。因为 redis 是把数据存储在内存中的,如果程序直接从内存中读取数据,那么速度肯定是比从硬盘中读取数据要快的。

如何使用 redis

redis 被设计为 key value 的方式。而且 redis 的数据类型也比较丰富,也提供了很多的操作命令。初步使用 redis,先使用 docker 起一个 redis 容器,然后使用 redis-cli 连接到 redis 容器中,然后就可以使用 redis 的命令了。

先用 docker 客户端操作一下 redis-cli

image.png

简单数据类型

set/get

set 命令用来设置 key value,如果 key 不存在,则创建 key,如果 key 存在,则覆盖 key 的 value。

get 命令用来获取对应 key 的 value,如果 key 不存在,则返回 nil。

image.png

incr

incr 命令用来对 key 的 value 进行自增操作,如果 key 不存在,则创建 key,如果 key 存在,则对 key 的 value 进行自增操作。

image.png

decr

decr 命令用来对 key 的 value 进行自减操作,如果 key 不存在,则创建 key,如果 key 存在,则对 key 的 value 进行自减操作。

image.png

del

del 命令用来删除 key。

image.png

keys

keys 命令用来获取所有的 key。要带一个查询条件,比如*,表示获取所有的 key。

image.png

list 数据类型

list 数据类型是一个有序的字符串链表,可以在链表的头部或者尾部插入数据,也可以在链表的头部或者尾部删除数据。

lpush

lpush 命令用来在链表的头部插入数据。

image.png

rpush

rpush 命令用来在链表的尾部插入数据。

image.png

image.png

lpop

lpop 命令用来在链表的头部删除数据。

image.png

rpop

rpop 命令用来在链表的尾部删除数据。

image.png

set 数据类型

set 数据类型是一个无序的字符串集合,可以添加,删除,查看集合中的元素。

sadd

sadd 命令用来向集合中添加元素。而且相同的元素不会重复添加。

image.png

image.png

sismember

sismember 命令用来判断集合中是否存在某个元素。

image.png

zset 数据类型

zset 数据类型是一个有序的字符串集合,可以添加,删除,查看集合中的元素。但是 zset 数据类型中的元素是有序的,而且每个元素都有一个分数,可以根据分数进行排序。

zadd

image.png

image.png

zrange

zrange 命令用来获取集合中的元素,可以根据分数进行排序。

image.png

zrank

zrank 命令用来获取集合中某个元素的排名。

image.png

zrevrank

zrevrank 命令用来获取集合中某个元素的倒序排名。

image.png

hash 数据类型

hash 数据类型是一个无序的字符串集合,可以添加,删除,查看集合中的元素。但是 hash 数据类型中的元素是无序的。

hset

hset 命令用来向集合中添加元素。而且相同的元素不会重复添加。

image.png

image.png

hget

hget 命令用来获取集合中的元素。

image.png

expire 设置过期时间

expire 命令用来设置 key 的过期时间。然后使用 ttl 命令来查看 key 的过期时间。

image.png

在 nest 中使用 redis

上面在 redis 的命令行中使用 redis-cli 简单体验了下 redis 的命令,接下来就在 nest 中使用 redis。一般使用最流行的 redis 库就是 redis、ioredis。来看下每种库的使用方式。

redis

安装 redis 库

npm install redis --save

使用 redis 库

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 {}

然后就是在 service 中使用 redis 库了。

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!'
  }
}

ioredis

安装 ioredis 库

npm install ioredis --save

使用 ioredis 库

import { Module } from '@nestjs/common'
import * as Redis from 'ioredis'

@Module({
  providers: [
    {
      provide: 'REDIS_CLIENT',
      useFactory: () => {
        return new Redis({
          // Redis服务器配置
          host: 'localhost',
          port: 6379
          // 其他选项...
        })
      }
    }
  ],
  exports: ['REDIS_CLIENT']
})
export class RedisModule {}

然后就是在 service 中使用 ioredis 库了。

import { Injectable, Inject } from '@nestjs/common'
import { Redis } from 'ioredis'

@Injectable()
export class MyService {
  constructor(
    @Inject('REDIS_CLIENT')
    private readonly redisClient: Redis
  ) {
    // 使用redisClient执行Redis操作
  }
}

小结

学习了redis的基础用法,然后结合nest中使用。对redis有了基本的认识,希望能帮助到你