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有了基本的认识,希望能帮助到你

相关推荐
404号扳手20 分钟前
Java 进阶知识(八)
java·后端
PILIPALAPENG20 分钟前
Skills篇-findskills:告别手动迁移Skill!跨AI工具通用能力,才是真高效
前端·人工智能·后端
honeymoose25 分钟前
Pnpm approve-builds --all Jenkins 第一次构建总是出错
后端
浮游本尊25 分钟前
Java学习第39天 - API 自动化测试、MockMvc 与可观测性日志
后端
程序员cxuan28 分钟前
太顶了,ChatGPT 要和 Codex 搞一起了。
人工智能·后端·程序员
算法印象派30 分钟前
Rokid AI 眼镜远程协作应用"一线互联"开发实践:重连机制与凭据缓存
后端
奥利奥夹心脆芙31 分钟前
深度学习框架ChatGPT原生训练模型和图像识别-手写数字识别
后端
JieE21235 分钟前
AIGC 工程化入门:从零搭建你的第一个 AI 应用 -- 以 DeepSeek API 为例,带你走通大模型应用开发的完整链路
node.js·aigc·ai编程
武子康36 分钟前
Java-14 深入浅出 MyBatis 插件机制深度解析:四大对象拦截与动态代理原理
java·后端
用户298698530141 小时前
Java 实战:精准操控 Word 文档中的内容控件
java·后端