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

Memcache 入門到實戰:PHP 高性能緩存架構設計指南

     編輯:PHP 相關知識

從原理到分佈式部署的完整 Memcache 實戰手冊

Memcache 作為經典的分佈式內存緩存系統,至今仍是高併發架構的核心組件。本文系統梳理安裝配置、PHP 操作、分佈式策略、緩存穿透/雪崩防護、安全加固全維度知識。

核心概念澄清

  • Memcached:服務器端守護進程(二進制文件名)
  • Memcache:項目名稱 / PHP 客戶端擴展名(php_memcache.dll/so)
  • Memcached (PHP擴展):較新的 php_memcached 擴展,基于 libmemcached,功能更豐富

建議:新項目優先使用 php_memcached(支持一致性哈希、Binary 協議、SASL 認證)。

安裝部署標準流程

服務端

# CentOS/RHEL
yum install memcached -y
# 或編譯安裝獲取最新版
wget https://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
./configure --prefix=/usr/local/memcached
make && make install

# 啟動參數詳解
memcached -d -m 1024 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /var/run/memcached.pid
# -d 守護進程 -m 內存(MB) -u 運行用戶 -l 監聽IP -p 端口 -c 最大連接 -P pid文件

PHP 擴展

# php_memcache (舊)
pecl install memcache
# php_memcached (新,推薦)
pecl install memcached
# php.ini 添加
extension=memcached.so

PHP 基礎操作 API

<?php
$mem = new Memcached(); // 或 new Memcache()
$mem->addServer('127.0.0.1', 11211); // 支持多服務器

// 存儲:key、value、過期時間(秒,0=永久)、壓縮標記
$mem->set('user:1001', ['name' => '張三', 'age' => 25], 3600);

// 讀取
$data = $mem->get('user:1001');

// 刪除
$mem->delete('user:1001');

// 原子操作:計數器
$mem->increment('page:pv:home'); // 自增
$mem->decrement('stock:item:100'); // 自減

// 批量操作
$mem->setMulti(['a' => 1, 'b' => 2]);
$vals = $mem->getMulti(['a', 'b']);

// 統計信息
$stats = $mem->getStats();
$serverStats = $mem->getServerList();

分佈式架構設計:一致性哈希 vs 客戶端分片

方案一:客戶端取模分片(簡單但擴容困難)

function getServer($key, $servers) {
    $hash = crc32($key); // 或 md5/murmurhash
    $index = $hash % count($servers);
    return $servers[$index];
}
// 缺點:增減服務器導致大量 Key 重新分佈(緩存失效風暴)

方案二:一致性哈希(Memcached 擴展內建)

$mem = new Memcached();
$mem->addServers([
    ['10.0.0.1', 11211, 33], // 權重
    ['10.0.0.2', 11211, 33],
    ['10.0.0.3', 11211, 34],
]);
// 內部使用 Ketama 算法,擴容時只有少量 Key 遷移

方案三:業務層路由(按用戶 ID 分片)

// 如:用戶 ID 尾號決定分片
$shard = $userId % 10;
$server = "memcache-shard-$shard.internal";
// 優點:業務可控、熱點隔離;缺點:代碼耦合、重分片困難

緩存策略與經典問題解決

1. 緩存穿透

查詢不存在的數據(如 ID=-1),每次直穿 DB。

  • 方案:緩存空對象(set('key', '', 300)),設置短過期
  • 布隆過濾器攔截明顯非法 Key
  • 接口層參數校驗

2. 緩存擊穿

熱點 Key 過期瞬間,大量請求同時打 DB。

  • 互斥鎖重建:if ($mem->add('lock:key', 1, 10)) { rebuild(); $mem->delete('lock:key'); } else { sleep(rand); retry; }
  • 熱點 Key 永不過期,後台異步更新

3. 緩存雪崩

大量 Key 同一時間過期,或 Memcache 掛掉。

  • 過期時間添加隨機值:expire = 3600 + rand(0, 600)
  • 多級緩存:本地緩存 + 分佈式緩存
  • 熔斷降級:Memcache 不可用時返回舊數據/默認值,不打 DB
  • 高可用部署:雙主/集群 + 自動故障轉移

4. 數據一致性

  • 更新 DB 後 異步 刪除/更新緩存(先删緩存再更新 DB 可能產生臨時不一致,但較安全)
  • 關鍵數據雙寫 + 定時全量校對修復
  • 讀取時檢查版本號/時間戳,不匹配則重建

安全加固清單

  1. 內網隔離:Memcache 僅綁定內網 IP(-l 10.0.0.1),禁止公網訪問
  2. 防火牆白名單:
    iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 11211 -j ACCEPT
    iptables -A INPUT -p tcp --dport 11211 -j DROP
  3. SASL 認證:php_memcached + Memcached 1.4.3+ 支持用戶名密碼
  4. 非 root 運行:專用用戶 memcached:memcached
  5. 監控告警:stats 監控命中率、內存使用、連接數、驅逐數

監控關鍵指標

指標健康閾值異常含義
get_hits / (get_hits + get_misses)> 90%命中率低,Key 設計或過期策略有問題
bytes / limit_maxbytes< 80%內存不足,頻繁驅逐
evictions緩慢增長激增說明內存壓力大
curr_connections< max_connections * 0.8連接池耗盡

總結:現代架構中的定位

雖然 Redis 功能更豐富(持久化、數據結構、Lua 腳本、集群),但 Memcache 仍有優勢:

  • 極簡模型:純 K-V,無複雜數據結構開銷
  • 多線程架構:單實例吞吐極高(Redis 單線程)
  • 客戶端成熟:各語言庫穩定,運維極簡

建議:會話緩存、頁面片段緩存、計數器、臨時 Token 用 Memcache;排行榜、消息隊列、發布訂閱、需持久化場景 用 Redis。兩者互補共存是大型架構常態。

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