本文記錄在 CentOS 7 上從原始碼編譯安裝 Redis、建立 systemd 服務、配置防火牆開放 6379 埠、安裝 PHP phpredis 擴展並進行連線測試的完整流程。
# 安裝編譯工具
yum -y install gcc gcc-c++ make
# 下載 (以 7.2.4 為例)
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
make
make PREFIX=/usr/local/redis install
# 複製配置檔
mkdir -p /etc/redis
cp redis.conf /etc/redis/redis.conf
bind 0.0.0.0 # 監聽所有介面 (生產請限制內網 IP)
protected-mode no # 關閉保護模式 (需配合防火牆)
port 6379
daemonize yes # 後台運行
pidfile /var/run/redis/redis.pid
dir /var/lib/redis # 資料目錄
appendonly yes # 開啟 AOF 持久化
maxmemory 2gb # 記憶體上限
maxmemory-policy allkeys-lru
logfile /var/log/redis/redis.log
建立目錄與權限:
mkdir -p /var/lib/redis /var/log/redis /var/run/redis
useradd -r -s /sbin/nologin redis
chown -R redis:redis /var/lib/redis /var/log/redis /var/run/redis
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
Type=forking
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now redis
systemctl status redis
# firewalld (CentOS 7 預設)
firewall-cmd --permanent --add-port=6379/tcp
firewall-cmd --reload
# 或 iptables (傳統)
iptables -A INPUT -p tcp --dport 6379 -j ACCEPT
service iptables save
redis-cli ping
# PONG
redis-cli
127.0.0.1:6379> SET name "Redis"
OK
127.0.0.1:6379> GET name
"Redis"
127.0.0.1:6379> QUIT
Windows (PHP 5.6 TS VC11 x64 範例):
# 下載預編譯 DLL: https://windows.php.net/downloads/pecl/releases/redis/
# 解壓 php_redis.dll 至 php/ext/
# php.ini 加入: extension=php_redis.dll
# 重啟 Apache
Linux (CentOS 7, PHP 7.2+ 範例):
yum -y install php-devel php-pear gcc make
pecl install redis
# 提示 "extension=redis.so" 加入 php.ini
echo "extension=redis.so" > /etc/php.d/redis.ini
systemctl restart php-fpm
connect('192.168.1.100', 6379); // 遠端 Redis IP
$redis->auth('password'); // 若有密碼
$redis->set('site', 'MySite');
echo $redis->get('site'); // MySite
// 管線批次寫入
$pipe = $redis->pipeline();
for ($i=0; $i<1000; $i++) $pipe->set("key:$i", $i);
$pipe->execute();
// Lua 腳本原子操作
$script = "local v = redis.call('GET', KEYS[1]); if v then return redis.call('INCR', KEYS[1]) else return redis.call('SET', KEYS[1], 1) end";
$redis->eval($script, ['counter'], 1);
| 問題 | 原因 | 解決 |
|---|---|---|
| redis-cli 連線被拒絕 | Redis 未啟動 / bind 配置 / 防火牆 | systemctl status redis、檢查 bind、firewall-cmd |
| PHP Class 'Redis' not found | phpredis 擴展未安裝或未載入 | pecl install redis、php.ini 加入 extension、重啟 php-fpm |
| AUTH 失敗 | redis.conf 設定 requirepass | PHP 呼叫 $redis->auth('pass') 或配置 masterauth |
| 記憶體用盡 | maxmemory 未設或過大 | 設定 maxmemory 與 maxmemory-policy |