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

相关推荐
晚风吹长发7 小时前
初步了解Linux中的动静态库及其制作和使用
linux·运维·服务器·数据结构·c++·后端·算法
梁下轻语的秋缘8 小时前
ESP32-WROOM-32E存储全解析:RAM/Flash/SD卡读写与速度对比
java·后端·spring
wanzhong23338 小时前
开发日记8-优化接口使其更规范
java·后端·springboot
羊小猪~~9 小时前
【QT】--文件操作
前端·数据库·c++·后端·qt·qt6.3
张彦峰ZYF10 小时前
商品供给域的工程化简要设计考量
后端·系统架构·商品模型·商品供给
小北方城市网11 小时前
微服务注册中心与配置中心实战(Nacos 版):实现服务治理与配置统一
人工智能·后端·安全·职场和发展·wpf·restful
20年编程老鸟java+ai全栈12 小时前
零基础搞定开发环境:PHP + Node.js + MongoDB + Python 一键安装全攻略
python·mongodb·node.js·php
爬山算法12 小时前
Hibernate(47)Hibernate的会话范围(Scope)如何控制?
java·后端·hibernate
源码宝13 小时前
云HIS二次开发实施路径指南
后端·源码·二次开发·saas·云his·医院信息系统
李慕婉学姐16 小时前
Springboot旅游景点管理系统2fj40iq6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端