Redis

Posted by Adam on August 24, 2022
Redis(Remote Dictionary Server)是一個開源的、高性能的鍵值存儲系統,通常用於快取、會話管理和即時數據分析等應用。以下是 Redis 的基礎教學: ### 安裝 Redis 您可以從 Redis 官方網站(https://redis.io/download)下載最新的 Redis 版本,然後按照相應的安裝說明進行安裝。或者,您也可以使用包管理工具來安裝 Redis,如在 Ubuntu 上使用以下命令: ```bash sudo apt-get update sudo apt-get install redis-server ``` ### 啟動 Redis 服務 安裝完成後,您可以啟動 Redis 服務。通常,Redis 服務將在默認端口 6379 上運行。 ```bash redis-server ``` ### Redis 客戶端 要與 Redis 進行交互,您需要使用 Redis 客戶端。Redis 客戶端可用於多種編程語言,包括 Python、Node.js、Java 等。以下是一個 Python 的示例: ```python import redis # 建立一個 Redis 客戶端連接 r = redis.StrictRedis(host='localhost', port=6379, db=0) # 設置鍵值對 r.set('mykey', 'Hello, Redis!') # 獲取值 value = r.get('mykey') print(value) ``` ### 基本 Redis 操作 以下是一些基本的 Redis 操作示例: 1. 設置鍵值對: ```python r.set('mykey', 'Hello, Redis!') ``` 2. 獲取值: ```python value = r.get('mykey') print(value) # 輸出:b'Hello, Redis!' ``` 3. 刪除鍵: ```python r.delete('mykey') ``` 4. 檢查鍵是否存在: ```python exists = r.exists('mykey') print(exists) # 如果存在,輸出 1,否則輸出 0 ``` 5. 自增和自減操作: ```python r.incr('counter') # 自增計數器 r.decr('counter') # 自減計數器 ``` ### Redis 數據結構 Redis 支援多種數據結構,包括字符串、數字、列表、集合、有序集合、哈希表等。您可以根據您的應用需求來選擇適當的數據結構。 這是一些示例操作: - 列表操作: ```python # 添加元素到列表 r.lpush('mylist', 'item1') r.lpush('mylist', 'item2') # 獲取列表範圍 items = r.lrange('mylist', 0, -1) print(items) ``` - 集合操作: ```python # 添加元素到集合 r.sadd('myset', 'member1') r.sadd('myset', 'member2') # 獲取集合元素 members = r.smembers('myset') print(members) ``` 這僅僅是 Redis 的基礎,Redis 還有許多高級功能,如發布/訂閱、事務、持久化等。要深入了解 Redis,您可以參考[官方文檔](https://redis.io/documentation)以及相關的教程和資源。希望這個基礎教學能夠幫助您入門 Redis。 --- ### Redis CLI Redis 提供了一個互動式的命令行工具,稱為 Redis CLI(Command Line Interface)或 Redis console,它允許您直接與 Redis 伺服器交互。以下是一些 Redis console 的使用範例: 1. 開啟 Redis console: 在終端中輸入以下命令以啟動 Redis console: ```bash redis-cli ``` 如果 Redis 伺服器在不同的主機或端口運行,您可以使用 `-h` 和 `-p` 選項來指定主機和端口,例如: ```bash redis-cli -h your_redis_host -p your_redis_port ``` 2. 設置和獲取鍵值對: 在 Redis console 中,您可以使用 `SET` 和 `GET` 命令來設置和獲取鍵值對: ```bash SET mykey "Hello, Redis!" GET mykey ``` 輸出: ``` "Hello, Redis!" ``` 3. 刪除鍵: 使用 `DEL` 命令刪除鍵: ```bash DEL mykey ``` 如果鍵成功被刪除,Redis 會返回 `(integer) 1`。 4. 列出所有鍵: 使用 `KEYS` 命令列出所有的鍵: ```bash KEYS * ``` 注意:`KEYS` 命令在生產環境中不應該經常使用,因為它可能會對性能造成影響。在生產環境中,您應該使用更高效的方式來查詢鍵。 5. 使用哈希表: Redis 支援哈希表數據結構。以下是一個示例,如何設置和獲取哈希表的值: ```bash HSET user:id1 username "john_doe" HSET user:id1 email "john@example.com" HGET user:id1 username ``` 輸出: ``` "john_doe" ``` 6. 退出 Redis console: 在 Redis console 中,您可以使用 `QUIT` 命令或快捷鍵 `Ctrl+C` 來退出。 這些是一些 Redis console 的基本操作範例。您可以使用 `HELP` 命令來查看更多的命令和使用說明,或者參考 Redis 官方文檔以獲取更多詳細資訊。希望這些範例能幫助您開始使用 Redis console 來交互式地操作 Redis 數據庫。 --- # Redis 叢集 這份會使用 **StatefulSet + Headless Service** 方式部署 6 個節點(3 master + 3 replica),是 Redis Cluster 的標準結構。 --- ## 📘 一、檔案名稱建議 建議你放在一個檔案裡,例如: ``` redis-cluster.yaml ``` 然後用: ```bash kubectl apply -f redis-cluster.yaml ``` 就能部署。 --- ## 🧱 二、完整 YAML + 詳細註解 ```yaml # ========================= # Redis Cluster 部署文件(含密碼) # 部署 6 個節點(3 主 + 3 從),啟用 requirepass/masterauth # ========================= # ------------------------- # Step 0: 密碼 Secret # ------------------------- apiVersion: v1 # Kubernetes API 版本 kind: Secret # 宣告建立 Secret 物件 metadata: name: redis-auth # Secret 名稱,之後會被 StatefulSet/Job 參照 type: Opaque # 一般鍵值型 Secret stringData: # 用文字直接放入(K8s 會自動轉 base64) password: "YourStrongPasswordHere" # 教學用:叢集對外與節點互連共用的密碼(示範用相同一組) --- # ------------------------- # Step 1: Headless Service # ------------------------- apiVersion: v1 # Kubernetes API 版本 kind: Service # 宣告建立 Service metadata: name: redis # Service 名稱,將做為 StatefulSet 的 serviceName labels: app: redis # 統一的標籤,供 selector 使用 spec: clusterIP: None # 設為 Headless Service,提供穩定 DNS(不做負載平衡) ports: - port: 6379 # 對外公布的 Service 連接埠(Pod 也用 6379) name: redis # 連接埠命名(可讀性用途) selector: app: redis # 只選到帶有 app=redis 的 Pod --- # ------------------------- # Step 2: StatefulSet(6 個節點) # ------------------------- apiVersion: apps/v1 # Kubernetes API 版本 kind: StatefulSet # 宣告建立 StatefulSet(提供穩定網域與 Volume 序號) metadata: name: redis # StatefulSet 名稱(Pod 會變成 redis-0, redis-1...) spec: serviceName: redis # 綁定上面的 Headless Service,產生穩定 DNS replicas: 6 # 一共 6 個 Pod(3 主 + 3 從) selector: matchLabels: app: redis # 管理帶有 app=redis 的 Pod template: metadata: labels: app: redis # Pod 標籤 spec: containers: - name: redis # 容器名稱 image: redis:7.2 # 使用官方 Redis 7.2 映像 imagePullPolicy: IfNotPresent # 本地有就用,沒有才拉 ports: - containerPort: 6379 # 容器內 Redis 服務埠 name: redis # 連接埠命名 env: # 從 Secret 注入密碼到環境變數 - name: REDIS_PASSWORD # 容器內環境變數名稱 valueFrom: secretKeyRef: name: redis-auth # 參照上方 Secret 名稱 key: password # 取用鍵:password # 主要啟動命令:開啟 cluster 模式 + 設定密碼 command: - "redis-server" # 執行 redis-server 主程式 - "--cluster-enabled" # 啟用叢集模式 - "yes" - "--cluster-config-file" # 叢集的節點配置檔,會寫在 /data 下 - "nodes.conf" - "--cluster-node-timeout" # 叢集節點逾時(毫秒),影響故障切換速度 - "5000" - "--appendonly" # 啟用 AOF 持久化(較安全) - "yes" - "--appendfilename" # AOF 檔名 - "appendonly.aof" - "--appendfsync" # AOF fsync 策略(everysec:每秒) - "everysec" - "--protected-mode" # 關閉保護模式以便於叢集內外部連線(搭配密碼) - "no" - "--requirepass" # 設定客戶端連線認證密碼(default user) - "$(REDIS_PASSWORD)" # 從環境變數注入(上面從 Secret 來) - "--masterauth" # 設定節點間複寫/叢集內互連所用的密碼 - "$(REDIS_PASSWORD)" # 這裡示範與 requirepass 同一組 # ---- 若你使用 ACL 想更細權限,可改用: # - "--aclfile" "users.acl" 或 "--user" "default on >$(REDIS_PASSWORD) ~* &* +@all" # 但為了學習簡單,我們此處用 requirepass/masterauth。 volumeMounts: - name: data # 掛載持久化 Volume mountPath: /data # Redis 預設會把 RDB/AOF/nodes.conf 放在這 resources: requests: # 最低資源需求(避免被擠兌) cpu: 100m memory: 128Mi limits: # 上限(避免暴衝) cpu: 500m memory: 512Mi volumeClaimTemplates: # 為每個 Pod 建立一個獨立 PVC(data-redis-0,1,...) - metadata: name: data # 對應到上面的 volumeMounts.name spec: accessModes: ["ReadWriteOnce"] # 單節點掛載 resources: requests: storage: 1Gi # 每個節點要求 1Gi 空間(可依需要調整) --- # ------------------------- # Step 3: Cluster Init Job(自動建立叢集,會帶密碼) # ------------------------- apiVersion: batch/v1 # Kubernetes API 版本 kind: Job # 宣告建立 Job(一次性工作) metadata: name: redis-cluster-init # Job 名稱 spec: template: spec: restartPolicy: OnFailure # 失敗才重試;成功就不會重跑 containers: - name: redis-cluster-init # 容器名稱 image: redis:7.2 # 使用 redis-cli 來建立叢集 env: - name: REDISCLI_AUTH # redis-cli 讀到此變數會自動帶密碼 valueFrom: secretKeyRef: name: redis-auth # 參照同一個 Secret key: password command: - "sh" # 用 shell 跑多行腳本 - "-c" - | echo "等待 Redis Pod 啟動中..." # 逐一等待 6 個節點能回應 PING(會自動用 REDISCLI_AUTH 帶密碼) for i in 0 1 2 3 4 5; do until redis-cli -h redis-$i.redis ping; do echo "redis-$i 還沒好,稍等一下..." sleep 3 done done echo "全部節點已啟動,建立叢集中..." # 建立 Redis Cluster(3 主 3 從),redis-cli 會自動帶 REDISCLI_AUTH 密碼 # 也可改成:redis-cli -a "$REDISCLI_AUTH" --cluster create ... redis-cli --cluster create \ redis-0.redis:6379 \ redis-1.redis:6379 \ redis-2.redis:6379 \ redis-3.redis:6379 \ redis-4.redis:6379 \ redis-5.redis:6379 \ --cluster-replicas 1 \ --cluster-yes echo "✅ Redis Cluster 建立完成!" ``` --- ## 📖 三、部署教學步驟 1️⃣ 建立 Redis Cluster ```bash kubectl apply -f redis-cluster.yaml ``` 2️⃣ 查看 Pod 狀態 ```bash kubectl get pods -l app=redis ``` 等所有 Pod 都是 `Running` 後,Job 會自動執行初始化。 3️⃣ 驗證叢集狀態 ```bash kubectl exec -it redis-0 -- redis-cli --cluster info redis-0.redis:6379 ``` 4️⃣ 連線測試 ```bash kubectl exec -it redis-0 -- redis-cli -c 127.0.0.1:6379> set user:100 "Alice" 127.0.0.1:6379> get user:100 ``` --- ## 🧠 四、延伸學習重點 | 主題 | 說明 | | -------------------- | ------------------------------------------------------ | | **Headless Service** | 給 StatefulSet 提供固定 DNS(redis-0.redis、redis-1.redis...) | | **StatefulSet** | 確保 Pod 和 Volume 對應固定,不會亂掉 | | **Cluster 模式** | Redis 自動分 slot(0–16383),分配到不同 master | | **Job** | 自動執行 `redis-cli --cluster create` 指令組成叢集 | | **PVC** | 確保重啟後資料不遺失 | ---