Skip to content

在 nest 中使用 redis ​

前言 ​

一般在后端业务开发中,不可避免的肯定是要用 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

img.png

简单数据类型 ​

set/get ​

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

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

img_1.png

incr ​

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

img_2.png

decr ​

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

img_3.png

del ​

del 命令用来删除 key。

img_4.png

keys ​

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

img_5.png

list 数据类型 ​

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

lpush ​

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

img_6.png

rpush ​

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

img_7.pngimg_8.png

lpop ​

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

img_9.png

rpop ​

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

img_10.png

set 数据类型 ​

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

sadd ​

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

img_11.pngimg_12.png

sismember ​

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

img_13.png

zset 数据类型 ​

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

zadd ​

img_14.pngimg_15.png

zrange ​

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

img_16.png

zrank ​

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

img_17.png

zrevrank ​

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

img_18.png

hash 数据类型 ​

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

hset ​

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

img_19.pngimg_20.png

hget ​

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

img_21.png

expire 设置过期时间 ​

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

img_22.png

在 nest 中使用 redis ​

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

redis ​

安装 redis 库

bash
npm install redis --save

使用 redis 库

typescript
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 库了。

typescript
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 库

bash
npm install ioredis --save

使用 ioredis 库

typescript
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 库了。

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

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

如有转载或 CV 的请标注本站原文地址