Redis 作為高性能鍵值存儲,廣泛用於緩存、會話、隊列、排行榜等場景。本文提供一個生產就緒的 RedisCluster 封裝類,支援主從讀寫分離、長連接複用、透明故障切換、事務管道、多種數據結構操作,並通過魔術方法暴露底層 Redis 實例滿足擴展需求。
// 配置示例
$redis = new RedisCluster(true); // 啟用集群模式
// 主節點(寫)
$redis->connect(['host' => '10.0.0.1', 'port' => 6379], true);
// 從節點(讀,可多個)
$redis->connect(['host' => '10.0.0.2', 'port' => 6379], false);
$redis->connect(['host' => '10.0.0.3', 'port' => 6379], false);
// 內部使用 pconnect 持久連接,進程生命周期內複用
// 關閉:$redis->close(2) 關閉所有
// 寫入自動序列化陣列/對象
$redis->hset('user:1', 'profile', ['name' => 'Tom', 'age' => 25]);
// 讀取自動反序列化(可關閉)
$profile = $redis->hget('user:1', 'profile'); // 返回陣列
$raw = $redis->hget('user:1', 'profile', false); // 返回序列化字符串
// SETNX + 過期時間實現鎖
if ($redis->setnx('lock:order:123', 'worker1')) {
$redis->expire('lock:order:123', 10); // 10秒自動釋放
// 業務邏輯
$redis->remove('lock:order:123');
}
// 取消註釋啟用
public function __call($name, $arguments) {
// 默認走 Master,可根據方法名判斷讀寫
$redis = $this->getRedis(true);
if (method_exists($redis, $name)) {
return call_user_func_array([$redis, $name], $arguments);
}
throw new BadMethodCallException("Method $name not exists");
}
啟用後可直接調用 $redis->zAdd()、$redis->geoAdd() 等未封裝方法,保持靈活性。
這個封裝類在多個千萬級日活項目中穩定運行,核心原則:接口極簡、職責單一、異常安全、擴展開放。根據團隊技術棧,可進一步封裝為 Laravel Facade、Symfony Service、ThinkPHP 驅動等框架集成形式。