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** | 確保重啟後資料不遺失 |
---