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

相关推荐
蝎子莱莱爱打怪5 小时前
Hadoop3.3.5、Hbase2.6.1 集群搭建&Phoenix使用记录
大数据·后端·hbase
David爱编程5 小时前
并发编程三大特性全解析:原子性、可见性、有序性,一文讲透!
java·后端
你的人类朋友6 小时前
git常见操作整理(持续更新)
前端·git·后端
你的人类朋友6 小时前
git中的Fast-Forward是什么?
前端·git·后端
黑客影儿7 小时前
Go特有的安全漏洞及渗透测试利用方法(通俗易懂)
开发语言·后端·安全·web安全·网络安全·golang·系统安全
追逐时光者8 小时前
一款基于 Ant Design 设计语言实现、漂亮的 .NET Avalonia UI 控件库
后端·.net
笃行35010 小时前
从零开始:SpringBoot + MyBatis + KingbaseES 实现CRUD操作(超详细入门指南)
后端
该用户已不存在10 小时前
这几款Rust工具,开发体验直线上升
前端·后端·rust
用户83562907805110 小时前
C# 从 PDF 提取图片教程
后端·c#
L2ncE11 小时前
高并发场景数据与一致性的简单思考
java·后端·架构