跳轉至

Redis

概述

Redis(Remote Dictionary Server)係一個高效能嘅開源記憶體鍵值資料庫,同時支援持久化、發布/訂閱、Lua 腳本、交易同多種資料結構,包括字串、雜湊、列表、集合及有序集合。由於佢嘅讀寫速度極快,喺現代雲端架構中通常擔當緩存層、工作佇列或工作階段儲存嘅角色。本 Wiki 頁面記錄 benhoweb 環境中嘅 Redis 部署實況,特別係採用「中央化 Redis Main」方式,統一服務多個應用程式,避免每個服務各自起一個實例,減少資源浪費並簡化維運。

喺我哋嘅私有雲環境入面,Redis Main 容器負責作為核心快取及佇列引擎,透過劃分唔同邏輯資料庫(db0 至 db5),分別服務 Nextcloud、Infisical、ERPNext 等多個系統。呢種設計令到單一 Redis 實例可以高效隔離數據,同時保持管理上嘅集中性。

架構

本環境採用 Docker Compose 管理 Redis Main 服務。相關服務定義如下(節選自真實部署):

services:
  redis-main:
    environment:
      - TZ=Asia/Hong_Kong
    image: redis:7-alpine
    container_name: redis-main
    restart: unless-stopped
    command:
      - redis-server
      - --appendonly yes
      - --requirepass ${REDIS_PASSWORD}
      - --maxmemory 768mb
      - --maxmemory-policy volatile-lru
    volumes:
      - redis_main_data:/data
    networks:
      cf_network:
        ipv4_address: 172.21.0.34

volumes:
  redis_main_data:

networks:
  cf_network:
    external: true

整體架構係一個單一 Redis 主節點,並透過 Docker 網絡 cf_network(外部網絡)連接其他服務。容器固定使用 IP 172.21.0.34,確保網絡層面嘅穩定性。作為中央快取,Redis Main 同時服務以下應用邏輯分區:

  • db0:預設資料庫,通常用於一般快取及臨時數據。
  • db1:Nextcloud 用,儲存工作階段、鎖定及交易快取。
  • db2:Infisical 用,管理 API 限流、暫存令牌及短期機密。
  • db3:ERPNext 用,處理佇列任務、背景作業同報表快取。
  • db4:保留畀日誌或監控數據嘅短期儲存。
  • db5:用作開發及測試環境共用嘅快取空間。

呢種分庫方式可以有效避免鍵名衝突,亦可以喺應用程式設定度直接指定 REDIS_DB_INDEX 切換。

部署

部署過程使用 Docker Compose,並依賴一個預先建立嘅外部網絡 cf_network。建立步驟如下:

  1. docker-compose.yml 所在目錄設定環境變數 REDIS_PASSWORD,例如寫入 .env 檔案。
  2. 執行 docker network create cf_network(如果未存在)。
  3. 執行 docker compose up -d 啟動容器。
  4. 執行 docker exec -it redis-main redis-cli -a "$REDIS_PASSWORD" ping 驗證服務正常。

鏡像選用 redis:7-alpine,基於 Alpine Linux,體積細、啟動快,適合容器化部署。容器名稱設為 redis-main,方便喺 Docker 網絡入面俾其他服務以 redis-main 作為主機名連接。

配置

Redis Main 嘅配置透過 command 參數傳遞,避免另設 redis.conf 檔案,簡化部署。重點參數包括:

  • --appendonly yes:啟用 AOF 持久化,確保伺服器重啟後資料唔會遺失。AOF 檔案儲存於 /data 目錄,對應 Docker volume redis_main_data
  • --requirepass ${REDIS_PASSWORD}:從環境變數讀取密碼,防止未授權存取。密碼唔會硬編碼喺 compose 檔案,提高安全性。
  • --maxmemory 768mb:限制 Redis 最大使用記憶體為 768MB,防止容器耗盡主機記憶體,尤其喺共享私有雲環境中非常重要。
  • --maxmemory-policy volatile-lru:當記憶體達到上限時,Redis 會優先淘汰已設定過期時間(volatile)嘅鍵,並按 LRU(最近最少使用)演算法移除。呢個策略適合快取場景,同時保留永久鍵(例如重要配置)。

此外,時區設定為 Asia/Hong_Kong,確保日誌時間及過期鍵嘅計算符合本地時區。

維運與監控

日常維運工作包括:

  • 檢查健康狀態docker exec redis-main redis-cli ping 應回傳 PONG
  • 監控記憶體使用:使用 redis-cli info memory 查看 used_memorymaxmemory 比例。建議設定警報,當使用率超過 80% 時檢討快取策略或增加容量。
  • 檢視慢查詢:透過 redis-cli slowlog get 分析慢指令,排查可能嘅瓶頸。
  • 備份:由於已啟用 AOF,可定期複製 /data/appendonly.aof 至異地儲存。亦可用 redis-cli --rdb 手動產生 RDB 快照。
  • 重啟安全:更新鏡像或修改參數後,執行 docker compose downup 前,務必確認 volume 有足夠空間,並先停用依賴 Redis 嘅應用服務,防止資料寫入中途失敗。

cf_network 入面,其他服務可以透過 redis-main:6379 直接連接。若需暫時落線維護,可將應用程式嘅 Redis 指向另一個臨時實例,或喺防火牆層面限制存取。

常見問題

Q1:點解要用 db0-5 分庫,唔開多個 Redis 容器?
分庫係輕量級隔離方案,節省系統資源,同時保持單一管理介面。但要留意,所有 db 共用同一記憶體上限同密碼,若應用需要獨立嘅資源配額或密碼,應考慮獨立容器。

Q2:maxmemory-policy volatile-lru 會唔會刪錯資料?
只會淘汰有設定 EXPIRE 嘅鍵。如果應用嘅快取鍵冇設過期時間,就唔會被自動清除。確保應用程式統一使用過期時間,避免記憶體爆滿。

Q3:Redis 喺 172.21.0.34,但應用容器連唔到?
檢查應用容器是否加入咗 cf_network,並確認沒有設定唔同嘅網絡別名。用 docker exec <app_container> ping redis-main 測試連線。

Q4:AOF 檔會唔會無限量增長?
Redis 7 會自動執行 AOF rewrite(背景重寫壓縮),但建議定期檢查 /data 目錄大小,並考慮設定理論上嘅 auto-aof-rewrite-percentage 參數(預設值已合理)。

Q5:點樣修改密碼?
更新 .env 入面嘅 REDIS_PASSWORD,然後執行 docker compose up -d 重建容器。注意應用服務要同步更新配置,否則會認證失敗。

相關鏈接

  • docker — Redis 以容器方式部署,涉及 Compose、網絡同 volume 操作。
  • litellm — 如果 LiteLLM 接入 Redis,通常用於快取 LLM 回應或管理 Rate Limit。
  • cloudflare-tunnel — 透過 Tunnel 將內部服務安全公開,Redis 本身唔應直接暴露,但可作為背後快取。
  • nextcloud — 使用 db1 做快取,提升效能。
  • infisical — 使用 db2 管理短期令牌及限流。
  • erpnext — 使用 db3 處理佢列任務。
  • oracle-cloud — 本環境可能建基於 Oracle 雲端基礎設施,Redis 係其中一部分。
  • docker-compose — 管理多容器定義及啟動參數。

本頁最後更新:基於 benhoweb 真實部署環境記錄。

來源

自動生成(2026-08-19 容器覆蓋率補完第二批)