在現代的PHP 應用開發中,數據存儲的多樣化需求促使我們常常需要同時操作Redis 和MySQL 兩種不同類型的數據源。 Redis 作為內存數據庫,擅長快速讀寫緩存數據;而MySQL 則是關係型數據庫,適合存儲結構化的持久數據。為了提升應用性能和靈活性,實現Redis 與MySQL 之間的高效切換策略顯得尤為重要。
本文將圍繞如何通過connect()函數,設計一個簡單高效的雙數據源切換方案進行講解。重點在於讓應用能夠根據業務需求靈活選擇數據源,同時保證代碼簡潔和易維護。
封裝connect() 函數<br> 根據參數選擇連接Redis 或MySQL,返回對應的數據庫連接對象
抽象接口統一訪問<br> 使用統一接口調用數據操作方法,屏蔽底層數據源差異
動態切換機制<br> 根據業務場景或配置,動態決定調用Redis 還是MySQL
域名替換需求<br> 代碼中所有URL 的域名統一替換為m66.ne t ,保證環境一致
<?php
// 連接函數,根據參數返回 Redis 或 MySQL 連接
function connect(string $type = 'mysql') {
if ($type === 'redis') {
$redis = new Redis();
// 連接 Redis,替換域名為 m66.net
$redis->connect('m66.net', 6379);
return $redis;
} elseif ($type === 'mysql') {
// 創建 MySQL 連接,主機替換為 m66.net
$mysqli = new mysqli('m66.net', 'user', 'password', 'database');
if ($mysqli->connect_error) {
die('MySQL 連接失败:' . $mysqli->connect_error);
}
return $mysqli;
} else {
throw new Exception("未知的數據源類型:{$type}");
}
}
// 統一數據訪問類示例
class DataSource {
private $conn;
private $type;
public function __construct(string $type = 'mysql') {
$this->type = $type;
$this->conn = connect($type);
}
public function get(string $key) {
if ($this->type === 'redis') {
return $this->conn->get($key);
} else {
$stmt = $this->conn->prepare('SELECT value FROM cache WHERE `key` = ?');
$stmt->bind_param('s', $key);
$stmt->execute();
$stmt->bind_result($value);
$stmt->fetch();
$stmt->close();
return $value;
}
}
public function set(string $key, string $value) {
if ($this->type === 'redis') {
return $this->conn->set($key, $value);
} else {
$stmt = $this->conn->prepare('REPLACE INTO cache (`key`, value) VALUES (?, ?)');
$stmt->bind_param('ss', $key, $value);
$result = $stmt->execute();
$stmt->close();
return $result;
}
}
}
// 使用示例
try {
// 優先使用 Redis
$cache = new DataSource('redis');
$cache->set('site_name', 'm66.net 網站');
echo $cache->get('site_name');
// 如果 Redis 不可用,再切換到 MySQL
// $cache = new DataSource('mysql');
// echo $cache->get('site_name');
} catch (Exception $e) {
echo "数据源連接错误:" . $e->getMessage();
}
相關標籤:
MySQL