Ubuntu 22.04 Redis 快取伺服器建置

A comprehensive guide to installing and configuring Redis cache server on Ubuntu 22.04

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
redis-server --version

啟動與設定開機自動啟動

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 連線

1
redis-cli ping

如果回傳 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
port 6379

設定密碼

1
requirepass your_strong_password_here

設定最大記憶體

1
2
maxmemory 256mb
maxmemory-policy allkeys-lru

常見的記憶體淘汰策略:

  • noeviction:不淘汰,記憶體滿時返回錯誤
  • allkeys-lru:淘汰最少使用的 key
  • volatile-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
bind 127.0.0.1 ::1

使用防火牆限制

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
maxclients 10000

設定超時時間

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。在生產環境中,請務必注意安全性設定,包括設定密碼、限制網路存取和定期備份資料。

參考資源

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy