本篇要解決的問題
我們在開發時,常常會遇到這樣的情況:
同一個頁面一進來,取得的資料很多都是相同的,比如一個商品的基本資訊、公告訊息的內文。
而大部份資料是由前端調用 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 記憶體使用狀況
- 設定過期時間與刪除資料
實作時,覺得有個介面看,比裝厲害下指令查要舒服多了。
