Redis 作為高性能鍵值存儲,生產環境部署需關注 **編譯優化、systemd 托管、AOF/RDB 混合持久化、內存策略、網絡安全** 等關鍵環節。本文以 CentOS 7 + Redis 6.2 為例,提供從源碼到可觀測生產實例的標準化路徑。
# 安裝編譯工具鏈與依賴
yum groupinstall -y "Development Tools"
yum install -y jemalloc-devel openssl-devel systemd-devel
# 下載驗證
cd /usr/local/src
wget https://download.redis.io/releases/redis-6.2.14.tar.gz
sha256sum redis-6.2.14.tar.gz # 核對官網 SHA256
# 解壓編譯 (啟用 jemalloc、TLS、systemd 支援)
tar xzf redis-6.2.14.tar.gz
cd redis-6.2.14
make MALLOC=jemalloc BUILD_TLS=yes USE_SYSTEMD=yes -j$(nproc)
make install PREFIX=/usr/local/redis
# 驗證二進制
/usr/local/redis/bin/redis-server --version
# Redis server v=6.2.14 sha=00000000:0 malloc=jemalloc bits=64 build=...
💡 jemalloc 顯著降低內存碎片;BUILD_TLS=yes 支援原生 TLS 連接;USE_SYSTEMD=yes 生成 systemd notify 型服務單元。
/usr/local/redis/etc/redis.conf
# 基礎
bind 127.0.0.1 192.168.1.100 # 僅監聽內網 + 本地,禁用 0.0.0.0
port 6379
daemonize yes
supervised systemd # 配合 systemd
pidfile /var/run/redis/redis.pid
logfile /var/log/redis/redis.log
loglevel notice
# 內存與淘汰
maxmemory 4gb # 物理內存 60-70%
maxmemory-policy allkeys-lru # 熱數據保留策略
# 持久化:RDB + AOF 混合 (推薦)
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec # 性能/安全平衡
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
# 安全
requirepass StrongRedisP@ssw0rd! # 強密碼
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG "CONFIG_$(openssl rand -hex 8)"
# 客戶端緩衝區
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 慢查詢
slowlog-log-slower-than 10000
slowlog-max-len 128
# 網絡
tcp-backlog 511
timeout 300
tcp-keepalive 60
# 建立專用用戶與目錄
useradd -r -s /sbin/nologin -d /var/lib/redis 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
# 配置文件權限
mkdir -p /usr/local/redis/etc
cp redis.conf /usr/local/redis/etc/
chown -R redis:redis /usr/local/redis/etc
chmod 640 /usr/local/redis/etc/redis.conf
# systemd 服務 (make install 已生成 /usr/lib/systemd/system/redis.service)
# 若無,手動建立 /etc/systemd/system/redis.service
cat > /etc/systemd/system/redis.service <<'EOF'
[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
ExecStop=/usr/local/redis/bin/redis-cli -p 6379 shutdown
TimeoutStopSec=10
Restart=always
RestartSec=3
LimitNOFILE=65535
PrivateTmp=yes
ProtectSystem=full
ProtectHome=yes
NoNewPrivileges=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now redis
systemctl status redis
# firewalld 僅放行內網訪問
firewall-cmd --permanent --new-service=redis
firewall-cmd --permanent --service=redis --set-description="Redis Server"
firewall-cmd --permanent --service=redis --add-port=6379/tcp
firewall-cmd --permanent --add-service=redis --zone=internal
firewall-cmd --reload
# SELinux 允許網絡端口
semanage port -a -t redis_port_t -p tcp 6379
# 或臨時放行
setsebool -P nis_enabled 1
# 基本連通
redis-cli -h 192.168.1.100 -a StrongRedisP@ssw0rd! ping
# PONG
# 功能測試
redis-cli -a 'StrongRedisP@ssw0rd!' <<'EOF'
SET test_key "Hello Redis 6.2"
GET test_key
EXPIRE test_key 60
TTL test_key
INFO memory
INFO persistence
SLOWLOG GET 5
EOF
# 基準壓測 (單線程 10 萬請求)
redis-benchmark -h 192.168.1.100 -a StrongRedisP@ssw0rd! -n 100000 -c 50 -t set,get
# 關注:latency p99 < 5ms、throughput > 80k ops/s
apt/yum install redis_exporter 或 docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter --redis.addr=redis://:password@host:6379used_memory/maxmemory、connected_clients、keyspace_hits/misses、rejected_connections、aof_rewrite_in_progress、rdb_bgsave_in_progressredis-cli BGREWRITEAOF 測試恢復。make distclean && make ... && systemctl reload redis (熱升級需 Sentinel/Cluster 協調)。| 坑點 | 後果 | 規避 |
|---|---|---|
| 綁定 0.0.0.0 無密碼 | 被掃描勒索、挖礦、數據洩露 | bind 內網 IP + 強密碼 + rename 危險命令 |
| maxmemory 未設 | OOM Killer 殺進程、服務不可用 | 設 60-70% 物理內存 + allkeys-lru |
| 僅用 RDB | 故障丟失最後快照後所有寫入 | RDB+AOF 混合,appendfsync everysec |
| 透明大頁 (THP) 開啟 | 延遲抖動、內存碎片 | echo never > /sys/kernel/mm/transparent_hugepage/enabled 寫入 rc.local |
| ulimit -n 過小 | 連接數達標報 "max clients reached" | LimitNOFILE=65535 + sysctl fs.file-max |
源碼編譯啟用 jemalloc/TLS/systemd → 生產配置 RDB+AOF+內存策略+安全加固 → systemd 托管 + 監控 + 備份 = 企業級 Redis 基石。
按此標準落地,Redis 從「緩存工具」進化為「可信賴的數據基礎設施」。