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

Memcached 緩存 MySQL 數據庫交互原理與緩存流程全解析:查詢、更新、新增、刪除四大操作模式

     編輯:MySQL 綜合教學

Memcached 作為 MySQL 前置緩存層,能將熱點查詢 QPS 提升 10-100 倍,降低 DB 負載 90% 以上。本文系統梳理 Memcached 與 MySQL 交互流程圖、四大操作模式、Key 設計規範、一致性保障策略、常見避坑指南。

一、架構流程圖(文字版)

[應用] --> (Key) --> [Memcached] --命中--> 返回數據
                    |--未命中--> [MySQL] --> 寫入 Memcached --> 返回數據

更新/新增/刪除:
[應用] --> [MySQL] 寫入成功 --> [Memcached] 刪除/更新對應 Key

二、四大核心操作模式

1. 查詢

$key = "thread_2009";
$val = $mem->get($key);
if ($val === false) {
    $val = $db->query("SELECT * FROM thread WHERE id=2009");
    $mem->set($key, $val, 0, 100);  // 過期 100 秒
}
return $val;
  • 先查緩存,未命中回源 DB,回寫緩存(Cache-Aside Pattern)。
  • 過期時間根據業務容忍度設定(秒級~小時級)。

2. 更新

$db->update("UPDATE thread SET views=views+1 WHERE id=2009");
$mem->delete("thread_2009");  // 刪除緩存,下次查詢自動回源載入新值
  • **先更新 DB,再刪緩存**。(若先刪緩存再更新 DB,併發讀請求可能將舊值回寫緩存,導致髒數據)。
  • 不直接 set 新值,避免併發更新時緩存版本倒退。

3. 新增

$db->insert("INSERT INTO thread ... VALUES (2010, 'new')");
$mem->delete("thread_list_page_1");  // 刪除列表頁緩存
$mem->delete("thread_count");        // 刪除計數緩存
  • 新增通常影響列表/統計緩存,精確刪除相關 Key 或使用 Tag/命名空間批量失效。

4. 刪除

$db->delete("DELETE FROM thread WHERE id=2009");
$mem->delete("thread_2009");
$mem->delete("thread_list_page_1");

三、Memcached 核心 API 對照

操作PHP MemcachedPython python-memcachedJava Spymemcached
獲取$mem->get($key)mc.get(key)client.get(key)
設置$mem->set($key, $val, $exp)mc.set(key, val, time)client.set(key, exp, val)
刪除$mem->delete($key)mc.delete(key)client.delete(key)

四、Key 設計規範

# 格式:業務域:實體:標識:屬性
thread:2009:detail
thread:2009:comments:page:1
user:10001:profile
order:202405:list:status:paid:page:1
  • 使用冒號分隔,可讀性強,支援前綴匹配刪除(需掃描 Key,慎用)。
  • 長度 < 250 字符(Memcached 限制),值 < 1MB(可調)。

五、一致性保障策略

  1. 最終一致性(主流):DB 寫入成功 → 異步刪緩存(MQ 消費者刪除),容忍毫秒級不一致。
  2. 雙刪策略:更新 DB 前後各刪一次緩存,縮小不一致窗口。
  3. 延遲雙刪:更新 DB → 刪緩存 → sleep(500ms) → 再刷一次,應對主從延遲導致的舊值回寫。
  4. 強一致性(極少用):分佈式鎖 + 同步雙寫,性能損耗大,僅用於庫存/金額核心字段。

六、避坑指南

坑點後果解決
緩存穿透(查不存在的 Key)請求直穿 DB,DB 掛掉布隆過濾器攔截 / 緩存空值(短 TTL)
緩存擊穿(熱 Key 過期瞬間併發)大量請求同時回源 DB互斥鎖重建 / 熱 Key 永不過期 + 異步更新
緩存雪崩(大量 Key 同一時間過期)流量洪峰打垮 DBTTL 加隨機抖動 / 多級緩存 / 熔斷限流
併發更新髒讀緩存版本倒退先更新 DB 再刪緩存 / 版本號 CAS
大 Value 超過 1MB寫入失敗/性能抖動拆分 Value / 啟用壓縮 / 改用 Redis

七、Memcached vs Redis 選型建議

  • Memcached:純緩存、多核縮放、Key-Value 簡單、無持久化需求、團隊熟悉。
  • Redis:需要數據結構、發布訂閱、Lua 腳本、持久化、高可用集群、Lua 速率限制。
  • 現代架構多採用 **Redis 單機/集群** 替代 Memcached,但 Memcached 仍在「純緩存、極高 QPS、無運維成本」場景有優勢。

掌握「查詢回源、寫入刪緩存、Key 規範化、一致性策略」四大核心,即可構建穩健的 MySQL + Memcached 緩存體系。

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