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

PHP Memcached 基礎操作入門教程

     編輯:PHP 相關知識

前言

Memcached 是高性能分佈式內存對象緩存系統,廣泛用於減輕數據庫壓力、加速動態 Web 應用。本文介紹 PHP Memcached 擴展的安裝配置與基本數據類型操作示例。

環境準備

1. 安裝 Memcached 服務端

# Ubuntu/Debian
sudo apt install memcached

# CentOS/RHEL
sudo yum install memcached

# 啟動並設置開機自啟
sudo systemctl start memcached
sudo systemctl enable memcached

2. 安裝 PHP 擴展

推薦使用 memcached (libmemcached 基礎) 而非舊版 memcache,功能更豐富、性能更好:

# Ubuntu (PHP 8.1 為例)
sudo apt install php8.1-memcached

# 或通過 PECL 安裝最新版
sudo pecl install memcached
# 編輯 php.ini 添加 extension=memcached.so

3. 驗證安裝

php -m | grep memcached
# 輸出 memcached 表示成功

核心操作代碼示例

<?php
/**
 * Memcached 基本操作演示
 * 支援多種數據類型、壓縮、序列化、原子操作
 */
try {
    $mem = new Memcached();
    
    // 添加服務器 (支援多台、權重)
    $mem->addServer('127.0.0.1', 11211); // 默認權重 0
    // $mem->addServer('10.0.0.2', 11211, 10); // 權重 10
    
    // 可選:設置選項
    $mem->setOption(Memcached::OPT_COMPRESSION, true);       // 啟用壓縮 (大值節省帶寬)
    $mem->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY); // 高效序列化
    $mem->setOption(Memcached::OPT_BINARY_PROTOCOL, true);   // 二進制協議
    $mem->setOption(Memcached::OPT_TCP_NODELAY, true);       // 降低延遲
    $mem->setOption(Memcached::OPT_CONNECT_TIMEOUT, 2000);   // 連接超時 2秒
    $mem->setOption(Memcached::OPT_RETRY_TIMEOUT, 2);        // 重試間隔

    echo "連接成功\n";

    // --- 1. 字符串操作 ---
    $mem->set('str:site', 'PHP技術站', 3600); // 鍵、值、過期時間(秒)
    echo "字符串: " . $mem->get('str:site') . "\n";

    // --- 2. 數值操作 (原子增減) ---
    $mem->set('counter:views', 100);
    $mem->increment('counter:views'); // 101
    $mem->increment('counter:views', 5); // 106
    $mem->decrement('counter:views', 2); // 104
    echo "計數器: " . $mem->get('counter:views') . "\n";

    // --- 3. 數組/對象 (自動序列化) ---
    $user = [
        'id' => 1001,
        'name' => '張三',
        'email' => 'zhangsan@example.com',
        'roles' => ['admin', 'editor'],
        'profile' => (object)['avatar' => 'avatar.jpg', 'bio' => '開發者']
    ];
    $mem->set('user:1001', $user, 1800); // 30分鐘過期
    $cachedUser = $mem->get('user:1001');
    echo "用戶對象: " . json_encode($cachedUser, JSON_UNESCAPED_UNICODE) . "\n";

    // --- 4. 多鍵批量操作 (減少網絡往返) ---
    $data = [
        'config:site_name' => 'MySite',
        'config:theme' => 'dark',
        'config:lang' => 'zh-CN'
    ];
    $mem->setMulti($data, 7200);
    $fetched = $mem->getMulti(['config:site_name', 'config:theme']);
    echo "批量獲取: " . json_encode($fetched) . "\n";

    // --- 5. CAS (檢查並設置) 實現樂觀鎖 ---
    $key = 'inventory:product_1';
    $mem->set($key, 100);
    $casToken = null;
    $value = $mem->get($key, null, $casToken); // 獲取值及 CAS 令牌
    // 模擬併發修改:只有 CAS 令牌匹配才成功
    if ($mem->cas($casToken, $key, $value - 1)) {
        echo "庫存扣減成功 (CAS)\n";
    } else {
        echo "併發衝突,需重試\n";
    }

    // --- 6. 觸摸/刪除/統計 ---
    $mem->touch('str:site', 7200); // 更新過期時間不改值
    $mem->delete('str:site');
    $stats = $mem->getStats();
    echo "服務器統計: " . json_encode($stats) . "\n";

} catch (Exception $e) {
    echo "錯誤: " . $e->getMessage() . "\n";
}

數據類型存儲說明

PHP 類型存儲方式注意事項
字符串/整數/浮點數直接存儲高效,支援原子增減
布爾值/null直接存儲get 返回原類型
數組/對象序列化存儲 (igbinary/msgpack/php)建議開啟 igbinary 擴展提升性能
資源不支援資源類型 (如 DB 連接) 無法序列化

序列化器選擇建議

  • igbinary:體積小、速度快、支援所有 PHP 類型,**生產環境首選** (需安裝 php-igbinary)。
  • msgpack:跨語言兼容性好,性能接近 igbinary。
  • php (默認):兼容性最好,但體積大、速度慢。
  • json:可讀性好,但不支援資源/對象完整還原,性能一般。

常見問題與最佳實踐

1. 鍵名設計規範

// 格式:業務模塊:實體類型:ID[:屬性]
// 例子:
'user:info:1001'
'product:detail:SKU12345'
'order:list:user_1001:page_1'
'cache:api:weather:beijing'

2. 緩存穿透/擊穿/雪崩防禦

  • 穿透:查詢不存在的鍵直達 DB → 緩存空值 (短 TTL) + 布隆過濾器攔截。
  • 擊穿:熱點鍵過期瞬間大量請求打 DB → 互斥鎖重建 + 隨機過期時間。
  • 雪崩:大量鍵同一時間過期 → 過期時間加隨機值 + 多級緩存 (本地 + 遠程)。

3. 連接池與持久連接


// PHP-FPM 模式下自動復用持久連接 (需配置 persistent_id)
$mem = new Memcached('my_pool'); // 同進程內復用
$mem->addServer('127.0.0.1', 11211);
// Swoole/RoadRunner 協程環境需自行管理連接池

總結

PHP Memcached 擴展提供了豐富的 API 支援字符串、數值、數組、對象等多類型存儲,配合原子操作、CAS 樂觀鎖、批量操作、多種序列化器,能滿足絕大多數緩存場景需求。關鍵在於:合理設計鍵名與過期策略、選擇高效序列化器、防範緩存三大經典問題、監控命中率與延遲指標。

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