首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Memcached 緩存 MySQL 核心原理與交互流程全景圖解

     編輯:MySQL 資料庫相關知識

架構定位

Memcached 作為中間緩存層,位於應用與 MySQL 之間,吸收高頻讀請求,降低數據庫 QPS 壓力,提升響應延遲。

交互流程圖解

┌─────────┐     ┌──────────────┐     ┌─────────┐
│  App    │────▶│  Memcached   │────▶│  MySQL  │
│ (Client)│     │  (Cache)     │     │  (DB)   │
└─────────┘     └──────────────┘     └─────────┘
      │               │                    │
      │ 1. GET key    │                    │
      │◀──────────────│                    │
      │               │                    │
      │ 2. MISS       │                    │
      │──────────────▶│                    │
      │               │ 3. SELECT ...      │
      │               │───────────────────▶│
      │               │                    │
      │               │ 4. Result Set      │
      │               │◀───────────────────│
      │               │                    │
      │               │ 5. SET key, value  │
      │               │ (TTL)              │
      │               │                    │
      │ 6. Return     │                    │
      │◀──────────────│                    │

四大核心操作模式

操作Memcached 動作MySQL 動作關鍵點
查詢 (SELECT)GET key → 命中返回 / 未命中觸發回源未命中時執行查詢回源後 SET key value TTL 回填緩存
更新 (UPDATE)DELETE key (或 SET 新值)執行更新先更新 DB,再刪緩存,避免臟讀
新增 (INSERT)DELETE key (相關列表緩存)執行插入列表/聚合緩存必須失效
刪除 (DELETE)DELETE key (相關緩存)執行刪除同更新策略

核心 API 對照

// PHP Memcached 擴展範例
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);

$key = 'thread_2009';
$ttl = 100; // 秒

// 1. 讀取
$data = $mc->get($key);
if ($data === false) {
    // 回源查詢
    $data = $db->query("SELECT * FROM threads WHERE id=2009")->fetch();
    $mc->set($key, $data, $ttl);
}

// 2. 更新
$db->execute("UPDATE threads SET views=views+1 WHERE id=2009");
$mc->delete($key); // 下次讀取自動回源

// 3. 新增
$db->execute("INSERT INTO threads ... VALUES (...)");
$mc->delete('thread_list_latest'); // 列表緩存失效

// 4. 刪除
$db->execute("DELETE FROM threads WHERE id=2009");
$mc->delete($key);
$mc->delete('thread_list_latest');

命名空間與 Key 設計規範

  • 前綴隔離:appname:module:entity:id (如 forum:thread:2009)
  • 版本號:Schema 變更時遷移不停機 v2:forum:thread:2009
  • TTL 分層:熱數據 5-30min,溫數據 1-6h,冷數據 12-24h
  • 防穿透:空值緩存 SET key '' 30 避免重複回源
  • 防雪崩:TTL 加隨機值 ttl + rand(0, 300) 錯峰失效

一致性模型與權衡

模式一致性性能複雜度適用場景
Cache-Aside (旁路緩存)最終一致高低讀多寫少、容忍秒級不一致
Read/Write Through強一致中高金融核心、需強一致
Write Behind (異步寫回)弱一致極高極高日誌、計數器、可丟失數據

主流選擇:Cache-Aside + 先更新 DB,再刪緩存 (雙刪策略:更新前刪、更新後延遲再刪)。

監控關鍵指標

  • get_hits / (get_hits + get_misses) → 命中率 (目標 > 90%)
  • evictions → 驅逐次數 (持續增長說明內存不足)
  • bytes / limit_maxbytes → 內存利用率
  • curr_connections → 連接數健康度
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved