首頁  >  文章  >  資料庫  >  如何使用Redis和TypeScript開發快取穿透防禦功能

如何使用Redis和TypeScript開發快取穿透防禦功能

WBOY
WBOY原創
2023-09-21 16:34:531204瀏覽

如何使用Redis和TypeScript開發快取穿透防禦功能

如何使用Redis和TypeScript開發快取穿透防禦功能

快取穿透指的是使用者在查詢一個不存在的資料時,由於快取中沒有對應的數據,每次都會直接存取資料庫,導致資料庫壓力過大。為了解決這個問題,我們可以利用Redis和TypeScript來開發快取穿透防禦功能。

一、安裝和設定Redis

首先,我們需要安裝Redis並進行設定。在Ubuntu系統上,可以透過以下命令安裝Redis:

sudo apt-get install redis-server

安裝完成後,預設情況下,Redis會以本機模式運作並監聽預設連接埠6379。然後,我們需要配置Redis的一些參數,以便使用。

在Redis設定檔中,找到以下設定並取消註解:

# bind 127.0.0.1 ::1

將其修改為:

bind 0.0.0.0

這樣,Redis將可以在本機以外的IP位址上進行監聽。

儲存並退出設定文件,然後重新啟動Redis服務:

sudo service redis-server restart

二、安裝和設定TypeScript

接下來,我們需要安裝和設定TypeScript。首先,請確保已經安裝了Node.js和npm。

然後,透過以下命令全域安裝TypeScript:

npm install -g typescript

建立一個新的TypeScript項目,並初始化npm:

mkdir cache-protection
cd cache-protection
npm init -y

安裝必要的TypeScript依賴:

npm install redis ioredis express
npm install --save-dev @types/redis @types/ioredis @types/express

三、寫程式碼

接下來,我們開始寫快取穿透防禦功能的程式碼。首先,在專案的根目錄下建立一個名為index.ts的檔案。

import express, { Request, Response } from 'express';
import Redis from 'ioredis';

const app = express();
const redis = new Redis();

// 缓存查询的函数
async function getDataFromCache(key: string): Promise<string | null> {
  return await redis.get(key);
}

// 从数据库查询数据的函数
async function getDataFromDb(key: string): Promise<string | undefined> {
  // 模拟从数据库查询的过程
  const dataFromDb = {
    '1': 'data1',
    '2': 'data2',
    '3': 'data3',
  };

  return dataFromDb[key];
}

// 将数据写入缓存的函数
async function setDataToCache(key: string, data: string): Promise<string> {
  return await redis.set(key, data);
}

// Express路由处理函数
app.get('/data/:id', async (req: Request, res: Response) => {
  const dataId = req.params.id;
  const cacheKey = `data:${dataId}`;

  // 尝试从缓存中获取数据
  let data = await getDataFromCache(cacheKey);

  // 如果缓存中没有数据,则从数据库中查询并写入缓存
  if (!data) {
    data = await getDataFromDb(dataId);
    if (data) {
      await setDataToCache(cacheKey, data);
    }
  }

  // 返回结果
  if (data) {
    res.send(data);
  } else {
    res.send('Data not found');
  }
});

// 启动Express服务
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

程式碼說明:

  1. 首先匯入所需的函式庫,包括express、redis和ioredis。
  2. 建立一個express實例,建立一個redis實例。
  3. 實現了三個基本的函數:從快取中取得資料、從資料庫中取得資料和將資料寫入快取。
  4. 編寫了一個Express的路由處理函數,用於接收請求並傳回對應的資料。
  5. 啟動Express服務,監聽3000埠。

四、執行程式碼

在命令列中,使用下列指令將TypeScript程式碼編譯為JavaScript:

tsc index.ts

然後,執行編譯後的JavaScript程式碼:

node index.js

現在,您可以透過造訪http://localhost:3000/data/1來測試快取穿透防禦功能了。首次存取會從資料庫中取得數據,並將數據寫入快取。再次存取相同的URL則會直接從快取中取得資料。

總結:

本文介紹如何使用Redis和TypeScript開發快取穿透防禦功能。透過快取查詢函數、從資料庫查詢資料函數以及資料寫入快取函數的組合,我們可以有效地減少對資料庫的訪問,提高系統效能。同時,利用Redis的高速讀寫特性,可以更好地應對高並發存取的情況。

希望本文能對您的開發工作有所幫助!

以上是如何使用Redis和TypeScript開發快取穿透防禦功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn