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

PHP Memcached 記憶體快取入門筆記與實戰部署

     編輯:PHP 相關知識

什麼是 Memcached?

Memcached 是一套高效能、分散式的記憶體物件快取系統。它在記憶體中維護一個巨大的 Hash Table,由 memcached 守護程式管理,讓應用程式能以極低延遲存取鍵值資料,大幅減輕資料庫負載。

名稱辨析

  • Memcache:專案/軟體名稱,也指 PHP 擴展 memcache(較舊、功能較少)。
  • Memcached:服務端守護程式程序名稱,也指 PHP 擴展 memcached(較新、支援完整協定、二進制協定、SASL 認證等)。建議新專案使用 memcached 擴展。

運作原理

  1. 應用程式收到請求,先查詢 Memcached 是否有快取資料(get)。
  2. 命中(Hit):直接回傳資料,不查資料庫。
  3. 未命中(Miss):查詢資料庫,取得結果後寫入 Memcached(set),再回傳給應用程式。
  4. 後續相同請求直接命中快取,大幅降低資料庫 QPS 與延遲。

Linux 環境安裝 Memcached 服務端

# 1. 安裝相依套件
sudo yum install -y libevent-devel gcc make   # CentOS/RHEL
# sudo apt-get install -y libevent-dev build-essential  # Debian/Ubuntu

# 2. 下載原始碼並編譯(以 1.6.21 為例)
wget https://memcached.org/files/memcached-1.6.21.tar.gz
tar -zxvf memcached-1.6.21.tar.gz
cd memcached-1.6.21
./configure --prefix=/usr/local/memcached
make && sudo make install

# 3. 建立系統服務(systemd)
sudo tee /etc/systemd/system/memcached.service <<'EOF'
[Unit]
Description=Memcached
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/memcached/bin/memcached -u memcached -m 256 -p 11211 -l 127.0.0.1 -c 1024
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 4. 建立執行用戶並啟動
sudo useradd -r -s /sbin/nologin memcached
sudo systemctl daemon-reload
sudo systemctl enable --now memcached
systemctl status memcached

常用啟動參數說明

參數說明預設值
-pTCP 監聽埠11211
-l綁定 IP 位址127.0.0.1
-d以 daemon 模式背景執行-
-u執行身分(需 root 啟動時指定)-
-m最大記憶體用量(MB)64
-M記憶體耗盡時回傳錯誤而非淘汰舊資料關閉
-c最大同時連線數1024
-f記憶體區塊增長因子1.25
-n最小配置空間(bytes,含 key+value+flags)48
-t工作執行緒數4
-v/-vv/-vvv詳細輸出等級-

PHP 安裝 memcached 擴展

# 安裝 libmemcached 函式庫
sudo yum install -y libmemcached-devel  # CentOS
# sudo apt-get install -y libmemcached-dev  # Ubuntu

# 安裝 PHP 擴展 (假設 PHP 8.2)
pecl install memcached
# 編譯過程中會詢問是否支援 json, igbinary, msgpack 等序列化,建議全選 y

# 在 php.ini 加入
extension=memcached.so

# 重啟 php-fpm
sudo systemctl restart php-fpm

PHP 基本操作範例

<?php
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);

// 設定序列化器(建議 igbinary 效能較好)
$mc->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY);

// 連線逾時與重試
$mc->setOption(Memcached::OPT_CONNECT_TIMEOUT, 1000);      // 1 秒
$mc->setOption(Memcached::OPT_RETRY_TIMEOUT, 1);           // 1 秒後重試
$mc->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT); // 一致性雜湊
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true); // 相容 ketama 演算法

// 寫入快取(過期時間 300 秒)
$key = 'user:profile:1001';
$data = ['id' => 1001, 'name' => 'Alice', 'email' => 'alice@example.com'];
$mc->set($key, $data, 300);

// 讀取快取
$cached = $mc->get($key);
if ($cached !== false) {
    echo "快取命中: ";
    print_r($cached);
} else {
    echo "快取未命中,查詢資料庫...";
    // $data = $db->query(...);
    // $mc->set($key, $data, 300);
}

// 刪除快取
$mc->delete($key);

// 批次操作
$mc->setMulti(['key1' => 'val1', 'key2' => 'val2'], 60);
$vals = $mc->getMulti(['key1', 'key2', 'key3']);
print_r($vals);

// 原子遞增/遞減(計數器)
$mc->set('counter:pageview', 0);
$mc->increment('counter:pageview');
$mc->decrement('counter:pageview');

進階主題與最佳實踐

1. 快取擊穿、穿透、雪崩防禦

  • 擊穿:熱門 key 過期瞬間大量請求直擊 DB。解法:互斥鎖(add 成功者重建快取,其等待)或邏輯過期(資料內含過期時間,背景非同步更新)。
  • 穿透:查詢不存在的 key。解法:快取空值(短 TTL)、布隆過濾器攔截、參數驗證。
  • 雪崩:大量 key 同時間過期。解法:TTL 加入隨機抖動(expire + rand(0, 300))、多級快取(本機記憶體 + Memcached)。

2. 資料一致性策略

  • Cache-Aside(旁路快取):應用程式負責讀寫快取與 DB,最常用但可能產生短暫不一致。
  • Write-Through:寫入時同步更新快取與 DB,強一致但寫入延遲較高。
  • Write-Behind:寫入快取後非同步批次寫入 DB,高效能但需容忍資料遺失風險。

3. 監控與調優

# 即時統計
memcached-tool 127.0.0.1:11211 stats
# 關鍵指標:get_hits, get_misses, evictions, bytes, curr_connections, limit_maxbytes

# 命中率 = get_hits / (get_hits + get_misses) * 100%
# 建議維持 90% 以上;evictions > 0 表示記憶體不足需擴容或優化 key 大小

常見坑點提醒

  1. Key 長度上限 250 字元,超長會自動截斷導致衝突。
  2. Value 上限 1 MB(可透過 -I 啟動參數調大至 128 MB)。
  3. 預設不支援持久化,重啟即清空,勿作為唯一資料來源。
  4. PHP memcached 擴展預設使用 igbinary 序列化,確保所有節點版本一致,避免反序列化失敗。
  5. 分散式部署時,客戶端需使用一致性雜湊(OPT_DISTRIBUTION),否則增減節點會導致大量快取失效。

掌握 Memcached 核心概念與操作細節,能為 PHP 應用帶來數量級的效能提升,是高併發架構不可或缺的基石組件。

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