生產環境中頻繁建立 Redis 連線極其低效。本文提供一個生產級單例封裝,採用私有構造函數、禁用克隆、靜態工廠方法,確保全局唯一連線實例,並內建認證、選庫、析構釋放機制。
getRedisInstance() 唯一入口,防止重複連線__construct、__clone 防止外部實例化/克隆RedisConnect.php)<?php
class RedisConnect {
// 連線配置常量
const REDISHOSTNAME = "127.0.0.1";
const REDISPORT = 6379;
const REDISTIMEOUT = 0;
const REDISPASSWORD = "ehualu";
const REDISDBNAME = 12;
private static $instance;
private $redis;
// 私有構造:建立連線、認證、選庫
private function __construct() {
$this->redis = new Redis();
$this->redis->connect(self::REDISHOSTNAME, self::REDISPORT, self::REDISTIMEOUT);
$this->redis->auth(self::REDISPASSWORD);
$this->redis->select(self::REDISDBNAME);
}
// 禁用克隆
private function __clone() {}
// 靜態工廠:獲取唯一實例
public static function getRedisInstance() {
if (!(self::$instance instanceof self)) {
self::$instance = new self();
}
return self::$instance;
}
// 獲取原生 Redis 物件操作
public function getRedisConn() {
return $this->redis;
}
// 析構:關閉連線、銷毀單例
public function __destruct() {
if (self::$instance) {
self::$instance->redis->close();
self::$instance = null;
}
}
}
<?php
require_once 'RedisConnect.php';
// 獲取 Redis 連線
$redis = RedisConnect::getRedisInstance()->getRedisConn();
// 執行操作
$redis->set('test_key', 'Hello Redis');
echo $redis->get('test_key'); // 輸出: Hello Redis
// 陣列操作
$redis->hSet('user:1', ['name' => 'Tom', 'age' => 25]);
print_r($redis->hGetAll('user:1'));
phpredis 3.0+ 內建連線池).env 或配置檔,支援多環境部署connect/auth/select 包裝 try-catch,拋出自定義異常便於上層統一處理set/get 自動處理陣列 json_encode/decode此單例類結構清晰、職責單一,是 PHP 專案接入 Redis 的標準化起點。