Redis 是高效能鍵值資料結構伺服器,支援 String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、GEO、Stream 等豐富型別,具備 RDB 快照與 AOF 重做日誌雙持久化機制。本文涵蓋:原始碼編譯安裝、核心配置參數解析 (持久化、記憶體、網路、安全、複寫、叢集)、系統核心參數調優、systemd 服務化、備份與災難恢復、生產部署檢查清單、常見效能陷阱。
# 1. 安裝編譯工具鏈
yum groupinstall -y "Development Tools" # CentOS/RHEL
apt-get install -y build-essential # Debian/Ubuntu
# 2. 下載最新穩定版 (以 7.2 為例)
cd /usr/local/src
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar zxvf redis-7.2.4.tar.gz
cd redis-7.2.4
# 3. 編譯 (支援 TLS、模組)
make -j$(nproc) BUILD_TLS=yes
make install PREFIX=/usr/local/redis
# 4. 驗證
/usr/local/redis/bin/redis-server --version
# Redis server v=7.2.4 ...
| 參數 | 建議值 | 說明 |
|---|---|---|
daemonize | yes | 守護進程模式 (systemd 管理時可設 no) |
pidfile | /var/run/redis/redis.pid | PID 檔路徑 |
port | 6379 | 監聽埠,生產環境建議修改非預設 |
bind | 127.0.0.1 或內網 IP | 嚴禁 0.0.0.0 直接暴露公網 |
timeout | 300 | 客戶端閒置超時秒數 (0 關閉) |
tcp-backlog | 511 | 連線佇列長度,配合 somaxconn |
loglevel | notice | debug/verbose/notice/warning |
logfile | /var/log/redis/redis.log | 日誌路徑 |
databases | 16 | 資料庫數量 (叢集模式固定 1) |
save 900 1 | 900 秒內 1 次寫入觸發 RDB | RDB 快照策略 (可多行疊加) |
save 300 10 | 300 秒內 10 次寫入 | |
save 60 10000 | 60 秒內 10000 次寫入 | |
rdbcompression | yes | RDB 壓縮 (LZF),CPU 換空間 |
dbfilename | dump.rdb | RDB 檔名 |
dir | /var/lib/redis | RDB/AOF 儲存目錄 (須可寫) |
appendonly | yes | 啟用 AOF 持久化 (生產強烈建議) |
appendfilename | appendonly.aof | AOF 檔名 |
appendfsync | everysec | always(最安全)/everysec(平衡)/no(最快) |
no-appendfsync-on-rewrite | yes | AOF 重寫期間暫停 fsync 避免阻塞 |
auto-aof-rewrite-percentage | 100 | AOF 檔案增長 100% 觸發重寫 |
auto-aof-rewrite-min-size | 64mb | 最小觸發大小 |
maxmemory | 2gb | 記憶體上限 (視實體 RAM 留 20-30% 給系統) |
maxmemory-policy | allkeys-lru | 淘汰策略:volatile-lru/allkeys-lru/volatile-ttl 等 |
maxmemory-samples | 5 | LRU 採樣數,越大越精確但耗 CPU |
requirepass | StrongPassw0rd! | 認證密碼 (ACL 用戶體系 6.0+ 推薦用 user) |
rename-command | FLUSHALL "" | 禁用/重命名危險指令 (FLUSHDB, KEYS, CONFIG 等) |
slowlog-log-slower-than | 10000 | 慢查詢閾值 10ms (微秒) |
slowlog-max-len | 128 | 慢查詢記錄保留條數 |
| 模式 | 資料安全性 | 效能影響 | 恢復速度 | 適用場景 |
|---|---|---|---|---|
| RDB only | 可能丟失最後一次快照後的寫入 | 低 (子進程 fork + 壓縮) | 快 (載入單一檔案) | 快取、可容忍秒級資料遺失 |
| AOF only (everysec) | 最多丟失 1 秒寫入 | 中 (每秒 fsync) | 慢 (重放指令) | 金融、訂單、不可遺失場景 |
| RDB + AOF (混合) | 兼具:RDB 定時備份 + AOF 秒級保護 | 中高 | 中 (優先載入 RDB 再重放 AOF 尾部) | 生產環境標準配置 |
| RDB + AOF (always) | 零資料遺失 (單機) | 高 (每寫入 fsync) | 慢 | 極高一致性需求 |
建議:生產環境啟用 appendonly yes + appendfsync everysec + 保留 RDB 策略,並定期將 RDB/AOF 檔案異地備份 (S3、NFS、異地機房)。
# /etc/sysctl.d/99-redis.conf
vm.overcommit_memory = 1 # 允許記憶體超額分配 (fork 複製時必需)
net.core.somaxconn = 65535 # 監聽佇列長度 (配合 tcp-backlog)
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
fs.file-max = 1000000 # 系統級檔案描述符上限
vm.swappiness = 0 # 盡量不使用 swap (Redis 對延遲敏感)
套用:sysctl --system,並加入 /etc/rc.local 或 systemd 服務 ExecStartPre 確保重開機生效。
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
Type=notify
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf --supervised systemd
ExecStop=/usr/local/redis/bin/redis-cli -p 6379 shutdown
TimeoutStopSec=30
LimitNOFILE=65535
LimitNPROC=65535
PrivateTmp=yes
PrivateDevices=yes
ProtectSystem=full
ReadWritePaths=/var/lib/redis /var/log/redis /var/run/redis
[Install]
WantedBy=multi-user.target
建立用戶目錄權限:
useradd -r -s /sbin/nologin redis
mkdir -p /var/lib/redis /var/log/redis /var/run/redis
chown -R redis:redis /var/lib/redis /var/log/redis /var/run/redis
chmod 750 /var/lib/redis /var/log/redis /var/run/redis
bind 僅綁定內網 IP,防火牆僅開放應用伺服器 IP 存取 6379requirepass 設定強密碼,或啟用 ACL user default on >password ~* +@allrename-command FLUSHALL "" 等禁用危險指令maxmemory 設定上限且 maxmemory-policy allkeys-lruvm.overcommit_memory=1 已套用somaxconn / tcp-backlog ≥ 511appendfsync everysec,RDB 策略合理used_memory、connected_clients、keyspace_hits/misses、rejected_connections、aof_last_rewrite_timeBGREWRITEAOF、BGSAVE、模擬主機宕機恢復| 現象 | 原因 | 解決 |
|---|---|---|
| CPU 飆高、延遲尖峰 | 大 Key 刪除 (DEL)、KEYS *、HGETALL 大 Hash | 用 UNLINK 非同步刪除、SCAN 替代 KEYS、分批讀取 |
| 記憶體持續增長不釋放 | maxmemory 未設、淘汰策略不當、AOF 重寫積壓 | 設定 maxmemory、調整 policy、檢查 aof_rewrite_in_progress |
| fork() 耗時過長導致延遲 | 記憶體過大、Transparent Huge Pages (THP) 開啟 | echo never > /sys/kernel/mm/transparent_hugepage/enabled 關閉 THP |
| 主從複寫中斷 | 網路抖動、repl-backlog-size 太小、輸出緩衝區溢出 | 增大 repl-backlog-size 100mb、client-output-buffer-limit slave 256mb 64mb 60 |