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

PHP Memcached 擴展功能優於 Memcache:CAS 樂觀鎖、多鍵操作、Binary Protocol 實戰

     編輯:PHP 綜合知識

為什麼選 Memcached(有 d)?

建立在 libmemcached 之上,繼承其完整協議支援:Binary Protocol、CAS、多鍵操作、自定義哈希/分佈算法。原生 memcache 早期實現,功能受限。

核心殺手級功能:CAS (Compare-And-Swap)

解決「檢查-然後-行動」競態條件(如計數器並發遞增、庫存扣減)。

Memcache 版本(無 CAS,有競態)

<?php
$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1); // 並發時可能丟失更新
?>

Memcached 版本(CAS 樂觀鎖,原子)

<?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。

其他獨有功能

  • getMulti/setMulti:單次網路往返批量讀寫,支援 GET_PRESERVE_ORDER 保持鍵順序。
  • getByKey/setByKey:指定鍵映射到特定節點(手動控制分佈)。
  • Binary Protocol:更緊湊、解析更快、支援認證(SASL)。
  • OPT_DISTRIBUTION / OPT_HASH / OPT_LIBKETAMA_COMPATIBLE:程式碼級精細控制分佈策略。
  • 觸發回調: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 相似),收益顯著。

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