Redis(Remote Dictionary Server)是高效能記憶體鍵值資料庫,支援豐富資料結構、持久化、主從複寫、Lua 腳本等特性,廣泛用於快取、Session 儲存、排行榜、分散式鎖、訊息佇列等場景。本文系統整理核心命令、五大資料類型操作、兩種持久化機制與 PHP 操作範例。
| 特性 | Redis | Memcached |
|---|---|---|
| 資料結構 | String, List, Hash, Set, Sorted Set, Bitmap, HyperLogLog, Stream | 單純 Key-Value (String) |
| 持久化 | RDB 快照 + AOF 日誌 | 不支援 |
| 單值大小上限 | 512 MB | 1 MB |
| 複寫架構 | Master-Slave、Cluster、Sentinel | Client 端一致性雜湊 |
| 適用場景 | 複雜資料操作、需持久化、排行榜、發布訂閱 | 純快取、簡單 Key-Value、超大物件 |
SET key value [EX seconds] [PX milliseconds] [NX|XX]
GET key
MGET key1 key2 ...
INCR key / DECR key / INCRBY key 5
APPEND key value
STRLEN key
LPUSH key val1 val2 ... # 頭部插入
RPUSH key val1 val2 ... # 尾部插入
LPOP key / RPOP key # 彈出
LRANGE key 0 -1 # 取全部
LTRIM key 0 99 # 保留前 100
LLEN key # 長度
# 應用:最新登入用戶、訊息佇列
HSET key field value
HGET key field
HGETALL key
HMSET key f1 v1 f2 v2 ...
HINCRBY key field 1
# 應用:用戶資料、商品屬性、物件儲存
SADD key member1 member2 ...
SREM key member
SMEMBERS key
SCARD key
SISMEMBER key member
SINTER key1 key2 ... # 交集
SUNION key1 key2 ... # 並集
SDIFF key1 key2 ... # 差集
# 應用:共同好友、標籤系統、去重
ZADD key score member
ZRANGE key 0 -1 WITHSCORES
ZREVRANGE key 0 -1 # 分數降序
ZRANK key member # 排名 (升序)
ZREVRANK key member # 排名 (降序)
ZINCRBY key 1 member
ZREMRANGEBYRANK key 0 9 # 移除前 10
# 應用:排行榜、延遲佇列、加權隨機
EXISTS key
DEL key1 key2 ...
TYPE key
KEYS pattern # 生產環境慎用,改用 SCAN
EXPIRE key 60 / PEXPIRE key 60000
TTL key / PTTL key
RENAME key newkey
RENAMENX key newkey
MOVE key 1 # 移至 DB 1
FLUSHDB / FLUSHALL
DBSIZE
redis.conf:save 900 1、save 300 10、save 60 10000BGSAVE(非阻塞)、SAVE(阻塞)appendonly yes、appendfsync everysec(預設,折中)BGREWRITEAOF 合併同一 Key 多次操作aof-use-rdb-preamble yes
# 重寫時產生 RDB 開頭 + AOF 尾部,兼具快速啟動與資料安全
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// $redis->auth('password'); // 若有密碼
// 選擇資料庫 (0-15)
$redis->select(0);
// String
$redis->set('site', 'example.com');
$redis->setex('token', 3600, 'abc123');
echo $redis->get('site');
// Hash - 用戶資料
$redis->hMSet('user:1001', ['name' => 'John', 'age' => 28, 'city' => 'Taipei']);
$user = $redis->hGetAll('user:1001');
// List - 最新動態
$redis->lPush('feed:latest', 'post_101');
$redis->lPush('feed:latest', 'post_102');
$latest = $redis->lRange('feed:latest', 0, 9);
// Sorted Set - 排行榜
$redis->zAdd('rank:score', 95, 'user_A');
$redis->zAdd('rank:score', 87, 'user_B');
$top3 = $redis->zRevRange('rank:score', 0, 2, true); // WITHSCORES
// Pipeline 批次執行 (減少 RTT)
$pipe = $redis->multi(Redis::PIPELINE);
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", "val:$i");
}
$pipe->exec();
// 連線池建議:使用 phpredis 5.3+ 的 RedisArray 或 Swoole/Workerman 長連線
allkeys-lru 或 volatile-lru 避免 OOM10000 (10ms) 監控慢指令rename-command FLUSHDB ""、rename-command KEYS ""Redis 憑藉多樣資料結構、亞毫秒延遲、靈活持久化成為現代架構核心組件。掌握五大類型適用場景、持久化權衡、Pipeline/事務/ Lua 腳本進階用法,並配合合理的記憶體淘汰策略與監控告警,即可在高併發系統中穩定發揮最大效能。