记录nodejs使用express搭建一个api服务器程序(6)-nodejs操作Redis 实现数据缓存

此文章是我自己用来记录如何搭建一个以express为基础的api服务器框架的过程,并不是什么新手教程,并不会每一步都写得非常详细,如果您要阅读此文,需要一点nodejs和编写代码的基础知识

文接上篇 链接: 地址 https://blog.csdn.net/goodboy31985/article/details/106315170
在上文基础上,修改和完善api服务器的框架

nodejs操作Redis 实现数据缓存

安装Redis

redis是一个高速的内存数据库,支持多种数据结构
由于mysql这类数据库系统,操作一般都比较慢,为了降低访问mysql的频率,通常我们会把redis作为一个数据缓存,充分利用其高速的特点,将一些频繁访问,但是变化不多的数据,缓存在内存中,
例如,我需要记录网站的访问人数,由于访问量很大,这个访问人数统计是在不断增加的,因此,我们不会每当有一个人来访问,就把这个数据写入数据库,而是先把这个数据缓存起来,再定期写入数据库中,这样可以大大降低数据库的读写频率
和memcached有些类似,但是与memcached相比,redis功能更加丰富一点,支持的数据结构更多,更重要的一点,redis是可以数据持久化的,机器重启了,数据也能得到保留(和持久化的策略设置有关),因此,你甚至可以把redis直接作为数据库来使用
之前的文章中已经写过使用Docker来部署本地Redis的内容,所以安装Redis请直接参考
Docker部署Redis
文章中也推荐的一款Redis的图形化客户端
链接: AnotherRedisDesktopManager
https://github.com/qishibo/AnotherRedisDesktopManager/releases
可以实时查看Redis中的数据

在nodejs中使用Redis

要在nodejs中使用Redis,需要安装客户端推荐的有 redis ioredis tedis等,都非常出色,
这里我就使用ioredis
先在项目中安装ioredis
npm install --save ioredis
npm install --save-dev @types/ioredis
ioredis的文档可以参考 ioredis文档 https://github.com/luin/ioredis
然后在项目中新建一个CacheManager的文件,创建一个缓存管理类,来管理Redis的操作
CacheManager.ts文件内容

// lib/common/CacheManager.ts

import ioredis, { Redis } from "ioredis"

export class CacheManager
{
    //单例
    private static instance: CacheManager = null;
    private constructor()
    {

    }
    public static GetInstance()
    {
        if (CacheManager.instance == null)
        {
            CacheManager.instance = new CacheManager();

        }
        return CacheManager.instance;
    }

    //mysql数据库对象
    redis: Redis = null;

    InitRedis()
    {
        //new一个redis对象,可以配置一些参数,也可以保持默认值
        this.redis = new ioredis(
            //{
            //port: 6379, // Redis port
            //host: "127.0.0.1", // Redis host
            //family: 4, // 4 (IPv4) or 6 (IPv6)
            //password: "auth",
            //db: 0,
            //}
        );

        //错误监听
        this.redis.on("error", function (err)
        {
            console.error("Error ", err);
        });

        this.redis.on("ready", function (err)
        {
            console.info("redisCache connection succeed")
        });
    }



}

//导出RedisManager这个单例对象,其他的文件中使用这个导出的对象即可
export const cache = CacheManager.GetInstance();

接下来在start.ts中写一些简单的测试代码,测试redis是否正常运行

//start.ts
import fs from "fs"
import json5 from "json5";
import path from 'path'
import { ApiServer } from "./ApiServer/ApiServer";
import { LogHelper } from "./lib/common/LogHelper";
import { db } from "./lib/common/DBManager";
import { cache } from "./lib/common/CacheManager";



//项目根目录
export const rootDir = __dirname + "/";

//加载配置文件
//读取json5文件内容
let jsonFile = fs.readFileSync(path.join(rootDir, "config.json5")).toString();
//解析为json文件,并作为模块输出
export let config = json5.parse(jsonFile);


async function main()
{
    //日志增强功能初始化
    LogHelper.Init();

    console.log("app start");

    //数据库连接初始化
    db.InitMysql();

    //Redis初始化
    cache.InitRedis();

    //Redis测试
    //1 直接设置key-value 并且在100秒后过期
    let result = await cache.redis.set("visitorCount", 1,"EX",100)
    console.log("result:",result);
    
    //2 读取刚刚设置的key的值
    let value = await cache.redis.get("visitorCount");
    console.log("visitorCount:", value);
    
    //3 设置hash 并且在300秒后过期
    await cache.redis.hset("1", "id", 1);
    await cache.redis.hset("1", "name", "zhang")
    await cache.redis.hset("1", "age", 35)
    await cache.redis.hset("1", "phone", "15965874521")
    await cache.redis.expire("1", 300);



    //4 读取刚刚设置的内容
    let hValue = await cache.redis.hgetall("1");
    console.log("hValue:",hValue);
    
    

    // ApiServer.GetInstance().Init();
    // await ApiServer.GetInstance().Run();

}

main();

运行代码查看log日志
在这里插入图片描述
正常设置了值,并获取到了
再使用Redis的图形客户端检查一下
在这里插入图片描述
在这里插入图片描述
以上便是最简单的Redis的使用,Redis拥有很多的特性和数据结构,细节的使用方式会在以后的章节中介绍
并且Redis很多时候是作为关系型数据库的补充,一般作为系统的缓存使用,比如 Redis+Mysql组合,频繁读写的数据会先经过Redis,尽量避免过于频繁得去读写mysql数据库
这些功能也会在以后的章节中介绍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章