Memcache 作為經典的分佈式內存緩存系統,至今仍是高併發架構的核心組件。本文系統梳理安裝配置、PHP 操作、分佈式策略、緩存穿透/雪崩防護、安全加固全維度知識。
php_memcache.dll/so)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_memcache (舊)
pecl install memcache
# php_memcached (新,推薦)
pecl install memcached
# php.ini 添加
extension=memcached.so
<?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();
function getServer($key, $servers) {
$hash = crc32($key); // 或 md5/murmurhash
$index = $hash % count($servers);
return $servers[$index];
}
// 缺點:增減服務器導致大量 Key 重新分佈(緩存失效風暴)
$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 尾號決定分片
$shard = $userId % 10;
$server = "memcache-shard-$shard.internal";
// 優點:業務可控、熱點隔離;缺點:代碼耦合、重分片困難
查詢不存在的數據(如 ID=-1),每次直穿 DB。
set('key', '', 300)),設置短過期熱點 Key 過期瞬間,大量請求同時打 DB。
if ($mem->add('lock:key', 1, 10)) { rebuild(); $mem->delete('lock:key'); } else { sleep(rand); retry; }大量 Key 同一時間過期,或 Memcache 掛掉。
expire = 3600 + rand(0, 600)-l 10.0.0.1),禁止公網訪問iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 11211 -j ACCEPT
iptables -A INPUT -p tcp --dport 11211 -j DROP
php_memcached + Memcached 1.4.3+ 支持用戶名密碼memcached:memcachedstats 監控命中率、內存使用、連接數、驅逐數| 指標 | 健康閾值 | 異常含義 |
|---|---|---|
| get_hits / (get_hits + get_misses) | > 90% | 命中率低,Key 設計或過期策略有問題 |
| bytes / limit_maxbytes | < 80% | 內存不足,頻繁驅逐 |
| evictions | 緩慢增長 | 激增說明內存壓力大 |
| curr_connections | < max_connections * 0.8 | 連接池耗盡 |
雖然 Redis 功能更豐富(持久化、數據結構、Lua 腳本、集群),但 Memcache 仍有優勢:
建議:會話緩存、頁面片段緩存、計數器、臨時 Token 用 Memcache;排行榜、消息隊列、發布訂閱、需持久化場景 用 Redis。兩者互補共存是大型架構常態。