使用 Docker 搭配 Node.js 快速建置 Redis 快取系統

使用 Docker 搭配 Node.js 快速建置 Redis 快取系統
使用 Docker 搭配 Node.js 快速建置 Redis 快取系統

本篇要解決的問題

我們在開發時,常常會遇到這樣的情況:

同一個頁面一進來,取得的資料很多都是相同的,比如一個商品的基本資訊、公告訊息的內文。

而大部份資料是由前端調用 API,API 再去資料庫查詢資料,所以會明明資料都是相同的,但每次都要耗掉效能去運算,流量多了,會大量消耗資料庫資源,接著讓系統變慢,使用者等待時間變長。

Redis 的橫空出世,就可以解決這個問題。

Redis 是一個快取資料庫,它的工作就像是一個超快速的暫存櫃。

比方我們去買早餐,如果同一個三明治,早餐店店員都是客人來了才現包,那就要花很多時間準備,客人就要等很久,久了生意就會不好,生意不好就沒有酷 $$ 買烏薩奇寶寶娃娃。

Redis 快取就像是台子上先放好大家常買的三明治,客人來了就直接拿取然後結帳,不用一直等店員製作,速度快很多,這樣子 $$ 進來的也快。

情境換成網站上,Redis 就是把常用的資料放在記憶體裡,這樣 API 就能快速回應,加強使用者體驗。

本篇筆記文會示範如何用 Redis 來做快取機制,並用 Docker 簡單快速地部署 Redis 環境,搭配 Node.js 實作。


用 Docker 安裝 Redis

使用 Docker 來安裝 Redis,可以直接複製貼上以下的 docker-compose.yml

以下 docker-compose.yml 的內容,會同時啟動兩個服務:

  • redis-server:Redis 伺服器。
  • redis-insight:Redis 官方提供的視覺化管理工具,方便查看和管理 Redis 資料。
version: "3.8"

services:
  redis:
    image: redis:8.0.2-alpine
    container_name: redis-server
    ports:
      - "6379:6379"
    command: >
      redis-server --maxmemory 2gb --maxmemory-policy allkeys-lru
    volumes:
      - ./data:/data
    restart: unless-stopped

  redisinsight:
    image: redis/redisinsight:latest
    container_name: redis-insight
    ports:
      - "5540:5540"
    depends_on:
      - redis
    restart: unless-stopped

volumes:
  redis-data:

重要說明

Redis 使用 redis:8.0.2-alpine 這個輕量級的映像檔,是這篇文章寫作時,截至 2025/6 為止的最新版本。

設定 --maxmemory 2gb,是限制 Redis 最多使用 2GB 記憶體,超過時用 allkeys-lru 策略自動淘汰最少使用的資料。避免塞太多資料讓記憶體先炸掉。

RedisInsight 會開在本機的 5540 PORT,可以用瀏覽器打開 http://localhost:5540 來管理 Redis。

啟動指令:

docker-compose up -d

這樣就會在背景啟動 Redis 服務和 RedisInsight。


Node.js 執行 Redis

在 Node.js 裡,我們用 ioredis 這個套件來連接 Redis,操作起來很簡單。

以下示範基本的快取讀寫範例,並附上幾個常用的 Redis 操作。

import Redis from "ioredis";

const redis = new Redis(); // 連到預設 localhost:6379

// 範例資料
const data = { message: "Hello August", time: Date.now() };

// 寫入快取,並設定 60 秒過期時間
await redis.set("api:result", JSON.stringify(data), "EX", 60);

// 讀取快取
const cache = await redis.get("api:result");
if (cache) {
  const parsed = JSON.parse(cache);
  console.log("讀到快取資料:", parsed);
} else {
  console.log("快取不存在或已過期");
}

// 常用 Redis 操作示範:

// 1. 設定鍵值並設定過期時間(EX: 秒,PX: 毫秒)
await redis.set("user:123", JSON.stringify({ name: "August" }), "EX", 120);

// 2. 取得鍵值
const userStr = await redis.get("user:123");

// 3. 刪除鍵
await redis.del("user:123");

// 4. 檢查鍵是否存在,回傳 1 或 0
const exists = await redis.exists("api:result");

// 5. 自增計數器
await redis.incr("page:view");

// 6. 取得自增後的值
const views = await redis.get("page:view");

console.log(`頁面瀏覽數:${views}`);

這些指令是常見的快取或計數器操作,可以依照需求再自行翻閱 官方文件或是問 ChatGPT


用 RedisInsight 查看資料

RedisInsight 是 Redis 官方的 GUI 管理工具,在前述的 docker-copmose.yml 就一併安裝好了,在瀏覽器輸入以下網址就可以看到:

http://localhost:5540

連接預設的 Redis 伺服器(localhost:6379),就可以用圖形介面:

  • 查詢所有快取鍵值
  • 查看資料內容(支援 JSON、String、List、Set、Hash 等類型)
  • 監控 Redis 記憶體使用狀況
  • 設定過期時間與刪除資料

實作時,覺得有個介面看,比裝厲害下指令查要舒服多了。

Summary
使用 Docker 搭配 Node.js 快速建置 Redis 快取系統
Article Name
使用 Docker 搭配 Node.js 快速建置 Redis 快取系統
Description
教你如何使用 Docker 安裝 Redis 並搭配 Node.js 實作快取機制,加速 API 效能,減少資料庫負載,並用 RedisInsight 管理快取資料。
訂閱
通知
guest

0 Comments
最舊
最新
Inline Feedbacks
看所有留言