Redis 簡介
Redis(Remote Dictionary Server)是一款開源的記憶體資料結構儲存系統,可作為資料庫、快取和訊息代理使用。Redis 以其極高的效能著稱,能夠每秒處理數十萬次的讀寫操作。
Redis 主要特色
- 高效能:資料儲存於記憶體中,讀寫速度極快
- 豐富的資料類型:支援字串、列表、集合、有序集合、雜湊等多種資料結構
- 持久化:支援 RDB 和 AOF 兩種持久化機制
- 主從複製:支援資料複製,可用於讀取擴展和高可用性
- 原子性操作:所有操作都是原子性的,支援交易處理
- Pub/Sub:內建發布/訂閱訊息機制
常見應用場景
- 網頁快取
- Session 管理
- 排行榜/計數器
- 訊息佇列
- 即時分析
安裝步驟
更新系統套件
首先,更新系統套件列表:
1
2
| sudo apt update
sudo apt upgrade -y
|
安裝 Redis
Ubuntu 22.04 的官方套件庫中已包含 Redis,可直接安裝:
1
| sudo apt install redis-server -y
|
確認安裝版本
啟動與設定開機自動啟動
1
2
3
4
5
6
7
8
| # 啟動 Redis 服務
sudo systemctl start redis-server
# 設定開機自動啟動
sudo systemctl enable redis-server
# 確認服務狀態
sudo systemctl status redis-server
|
測試 Redis 連線
如果回傳 PONG,表示 Redis 已成功安裝並運作。
基本設定
Redis 的設定檔位於 /etc/redis/redis.conf。
編輯設定檔
1
| sudo nano /etc/redis/redis.conf
|
常用設定項目
綁定 IP 位址
預設 Redis 只綁定到 localhost(127.0.0.1),如需遠端存取可修改:
1
2
3
4
5
| # 僅本機存取(預設,較安全)
bind 127.0.0.1 ::1
# 允許所有 IP 存取(不建議用於生產環境)
# bind 0.0.0.0
|
設定連接埠
設定密碼
1
| requirepass your_strong_password_here
|
設定最大記憶體
1
2
| maxmemory 256mb
maxmemory-policy allkeys-lru
|
常見的記憶體淘汰策略:
noeviction:不淘汰,記憶體滿時返回錯誤allkeys-lru:淘汰最少使用的 keyvolatile-lru:只淘汰設定過期時間的 key 中最少使用的allkeys-random:隨機淘汰volatile-ttl:淘汰即將過期的 key
設定持久化
RDB 持久化設定:
1
2
3
4
5
6
| # 900 秒內至少 1 個 key 變更則儲存
save 900 1
# 300 秒內至少 10 個 key 變更則儲存
save 300 10
# 60 秒內至少 10000 個 key 變更則儲存
save 60 10000
|
AOF 持久化設定:
1
2
| appendonly yes
appendfsync everysec
|
重新載入設定
修改設定後,重新啟動服務:
1
| sudo systemctl restart redis-server
|
常用資料類型與指令
連接 Redis
1
2
3
4
5
6
7
8
9
| # 無密碼連接
redis-cli
# 有密碼連接
redis-cli -a your_password
# 連接後驗證密碼
redis-cli
AUTH your_password
|
字串(String)
字串是 Redis 最基本的資料類型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 設定值
SET name "Redis"
# 取得值
GET name
# 設定值並設定過期時間(秒)
SETEX session_token 3600 "abc123"
# 數值增減
SET counter 10
INCR counter # 11
DECR counter # 10
INCRBY counter 5 # 15
# 檢查 key 是否存在
EXISTS name
|
列表(List)
列表是簡單的字串列表,按照插入順序排序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 從左側推入
LPUSH mylist "first"
LPUSH mylist "second"
# 從右側推入
RPUSH mylist "third"
# 取得列表範圍(0 到 -1 表示全部)
LRANGE mylist 0 -1
# 取得列表長度
LLEN mylist
# 從左側取出
LPOP mylist
# 從右側取出
RPOP mylist
|
集合(Set)
集合是無序的字串集合,成員唯一。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 新增成員
SADD myset "apple"
SADD myset "banana"
SADD myset "orange"
# 取得所有成員
SMEMBERS myset
# 檢查成員是否存在
SISMEMBER myset "apple"
# 取得成員數量
SCARD myset
# 移除成員
SREM myset "banana"
# 集合運算
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"
SINTER set1 set2 # 交集:b, c
SUNION set1 set2 # 聯集:a, b, c, d
SDIFF set1 set2 # 差集:a
|
雜湊(Hash)
雜湊是鍵值對的集合,適合儲存物件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 設定欄位
HSET user:1 name "John"
HSET user:1 age 30
HSET user:1 email "john@example.com"
# 一次設定多個欄位
HMSET user:2 name "Jane" age 25 email "jane@example.com"
# 取得單一欄位
HGET user:1 name
# 取得多個欄位
HMGET user:1 name age
# 取得所有欄位和值
HGETALL user:1
# 檢查欄位是否存在
HEXISTS user:1 name
# 刪除欄位
HDEL user:1 email
|
有序集合(Sorted Set)
有序集合類似集合,但每個成員都有一個分數,用於排序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 新增成員(分數, 成員)
ZADD leaderboard 100 "player1"
ZADD leaderboard 85 "player2"
ZADD leaderboard 92 "player3"
# 按分數排序取得成員(升序)
ZRANGE leaderboard 0 -1
# 按分數排序取得成員(降序)
ZREVRANGE leaderboard 0 -1
# 取得成員分數
ZSCORE leaderboard "player1"
# 取得成員排名(從 0 開始)
ZRANK leaderboard "player2"
# 增加成員分數
ZINCRBY leaderboard 10 "player2"
# 取得分數範圍內的成員
ZRANGEBYSCORE leaderboard 80 95
|
通用指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 查看所有 key
KEYS *
# 查看符合模式的 key
KEYS user:*
# 刪除 key
DEL mykey
# 設定過期時間(秒)
EXPIRE mykey 60
# 查看剩餘過期時間
TTL mykey
# 查看 key 的資料類型
TYPE mykey
# 清空目前資料庫
FLUSHDB
# 清空所有資料庫
FLUSHALL
|
安全性設定
設定密碼驗證
編輯 /etc/redis/redis.conf:
1
| requirepass your_strong_password_here
|
使用密碼連接:
1
2
3
4
| redis-cli -a your_strong_password_here
# 或連接後驗證
redis-cli
127.0.0.1:6379> AUTH your_strong_password_here
|
限制網路存取
只允許本機存取
使用防火牆限制
1
2
| # 使用 UFW 限制 Redis 連接埠
sudo ufw allow from 192.168.1.0/24 to any port 6379
|
停用危險指令
在設定檔中重新命名或停用危險指令:
1
2
3
4
5
6
7
8
| # 停用指令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command SHUTDOWN ""
# 或重新命名為複雜名稱
rename-command FLUSHDB "FLUSHDB_RANDOM_STRING"
|
設定最大連接數
設定超時時間
1
2
| # 客戶端閒置超過 300 秒自動斷開(0 表示不限制)
timeout 300
|
使用 TLS/SSL 加密
Redis 6.0 以上版本支援 TLS,編輯設定檔:
1
2
3
4
5
| tls-port 6379
port 0
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt
|
定期備份
建立自動備份腳本:
1
2
3
4
5
6
7
8
9
| #!/bin/bash
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump_$DATE.rdb
# 保留最近 7 天的備份
find $BACKUP_DIR -name "dump_*.rdb" -mtime +7 -delete
|
設定定時任務:
1
2
3
| crontab -e
# 每天凌晨 2 點備份
0 2 * * * /path/to/backup_redis.sh
|
結語
Redis 是一款功能強大且易於使用的快取伺服器。透過本文的介紹,您應該已經了解如何在 Ubuntu 22.04 上安裝、設定和使用 Redis。在生產環境中,請務必注意安全性設定,包括設定密碼、限制網路存取和定期備份資料。
參考資源