首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Redis 單例連線類:線程安全、配置常量化、自動資源釋放

     編輯:PHP 相關知識

PHP Redis 單例連線類:線程安全、配置常量化、自動資源釋放

生產環境中頻繁建立 Redis 連線極其低效。本文提供一個生產級單例封裝,採用私有構造函數、禁用克隆、靜態工廠方法,確保全局唯一連線實例,並內建認證、選庫、析構釋放機制。

核心特性

  • 單例模式:getRedisInstance() 唯一入口,防止重複連線
  • 配置常量化:Host、Port、Timeout、Password、DB 統一常量管理
  • 線程安全:私有 __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 的標準化起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved