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

PHP 應用效能優化系列(三):用 Memcached 記憶體快取減輕資料庫壓力

     編輯:PHP 綜合知識

為什麼需要 Memcached

資料庫查詢通常是 PHP 應用最大瓶頸:網路延遲、查詢執行、結果傳輸、物件映射。Memcached 將熱門資料物件存入記憶體,微秒級存取,大幅降低 DB 負載與回應時間。

架構圖解

[PHP App] --> [Memcached Client] --> [Memcached Server 叢集]
     │                                    │
     └----------> [MySQL] (快取未命中時) <--┘

安裝部署 (Debian/Ubuntu 範例)

# 伺服端
apt update && apt install memcached libmemcached-tools

# 客戶端 PHP 擴充
apt install php-memcached   # 推薦:libmemcached 基礎,功能完整
# 或
pecl install memcached      # 手動編譯需 --enable-memcached --with-libmemcached-dir

啟動服務:systemctl enable --now memcached,預設監聽 11211 port。

PHP 使用範例

addServer('127.0.0.1', 11211);
// 生產環境加多台:$mem->addServers([['host1',11211], ['host2',11211]]);

$key = 'article:123';
$article = $mem->get($key);

if ($article === false) { // 快取未命中
    // 從 DB 讀取
    $pdo = new PDO('mysql:host=localhost;dbname=blog', 'user', 'pass');
    $stmt = $pdo->prepare('SELECT * FROM articles WHERE id = ?');
    $stmt->execute([123]);
    $article = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // 寫入快取,TTL 300 秒
    $mem->set($key, $article, 300);
}

echo json_encode($article);

進階模式

  • 快取穿透防護:空結果也快取(短 TTL),或布隆過濾器攔截不存在鍵
  • 快取雪崩:TTL 加隨機值、互斥鎖重建、多級快取
  • 快取擊穿:熱鍵重建時用 getDelayed + fetchAll 或分散式鎖
  • 資料一致性:寫入 DB 後 delete 或 replace 快取;關鍵資料用「先刪快取再更新 DB」+ 重試機制

叢集與高可用

  • Client 端一致性雜湊自動分散鍵值
  • 單節點故障自動移除,不影響其他節點
  • 需更高可用性可搭配 Redis Cluster 或 Twemproxy

監控指標

# 即時統計
memcached-tool 127.0.0.1:11211 stats

# 關鍵指標
get_hits / (get_hits + get_misses)  > 90%  命中率
evictions  頻繁表示記憶體不足
curr_connections  連線數
bytes / limit_maxbytes  記憶體使用率

Memcached vs Redis 選型

特性MemcachedRedis
資料結構單純 Key-ValueString/Hash/List/Set/SortedSet/Stream
持久化無RDB/AOF 可選
複寫/HAClient 端內建 Sentinel/Cluster
Lua 腳本無支援原子操作
適用場景純快取、大量小物件快取+佇列+排行榜+Session+分散式鎖

現代架構常 兩者並用:Memcached 做純快取,Redis 做複雜資料結構與持久化需求。

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