Nest.js 系列——在 Nest.js 中使用 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

简单数据类型

set/get

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

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

incr

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

decr

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

del

del 命令用来删除 key。

keys

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

list 数据类型

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

lpush

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

rpush

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

lpop

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

rpop

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

set 数据类型

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

sadd

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

sismember

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

zset 数据类型

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

zadd

zrange

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

zrank

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

zrevrank

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

hash 数据类型

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

hset

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

hget

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

expire 设置过期时间

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

在 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操作
  }
}

小结

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

相关推荐
WeiLai111210 分钟前
面试基础--微服务架构:如何拆分微服务、数据一致性、服务调用
java·分布式·后端·微服务·中间件·面试·架构
浪九天29 分钟前
Vue 不同大版本与 Node.js 版本匹配的详细参数
前端·vue.js·node.js
大脑经常闹风暴@小猿2 小时前
1.1 go环境搭建及基本使用
开发语言·后端·golang
尚学教辅学习资料2 小时前
基于SpringBoot的美食分享平台+LW示例参考
spring boot·后端·美食
Vitalia4 小时前
从零开始学 Rust:基本概念——变量、数据类型、函数、控制流
开发语言·后端·rust
猎人everest7 小时前
SpringBoot应用开发入门
java·spring boot·后端
小纯洁w11 小时前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
孤雪心殇12 小时前
简单易懂,解析Go语言中的Map
开发语言·数据结构·后端·golang·go
熬夜不洗澡13 小时前
Node.js中不支持require和import两种导入模块的混用
node.js
bubusa~>_<13 小时前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js