建立在 libmemcached 之上,繼承其完整協議支援:Binary Protocol、CAS、多鍵操作、自定義哈希/分佈算法。原生 memcache 早期實現,功能受限。
解決「檢查-然後-行動」競態條件(如計數器並發遞增、庫存扣減)。
<?php
$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1); // 並發時可能丟失更新
?>
<?php
$md = new Memcached();
$md->addServer('localhost', 11211);
// 獲取值與 CAS token
$token = null;
$v = $md->get('counter', null, $token);
// 嘗試原子更新
if (!$md->cas($token, 'counter', $v + 1)) {
// CAS 失敗:並發修改,重試邏輯
// 可循環重試或拋出異常
echo "CAS failed, retry...";
}
?>
$token 實為版本號。get 讀取時附帶版本,cas 僅當版本匹配時寫入。若中間有其他寫入,版本變更,cas 返回 false。
GET_PRESERVE_ORDER 保持鍵順序。setOption(Memcached::OPT_CALLBACKS, [...]) 實現鍵過期/淘汰通知。<?php
$md = new Memcached();
$md->addServers([
['mc1', 11211, 33],
['mc2', 11211, 33],
['mc3', 11211, 34],
]);
// 一致性哈希 + Ketama 相容
$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
// 高效序列化
$md->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY);
// 連線池優化(持久連線)
$md->setOption(Memcached::OPT_CONNECT_TIMEOUT, 1000); // ms
$md->setOption(Memcached::OPT_RETRY_TIMEOUT, 10); // 秒
$md->setOption(Memcached::OPT_SEND_TIMEOUT, 2000);
$md->setOption(Memcached::OPT_RECV_TIMEOUT, 2000);
$md->setOption(Memcached::OPT_TCP_NODELAY, true);
$md->setOption(Memcached::OPT_NO_BLOCK, true); // 非阻塞 I/O
// 壓縮大值
$md->setOption(Memcached::OPT_COMPRESSION, true);
$md->setOption(Memcached::OPT_COMPRESSION_THRESHOLD, 1024); // >1KB 壓縮
?>
新專案無理由使用 memcache。Memcached 擴展功能完備、效能更優、維護更活躍。遷移成本極低(API 相似),收益顯著。