此文章是我自己用來記錄如何搭建一個以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數據庫
這些功能也會在以後的章節中介紹