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

Memcached 深度解析:架構原理、記憶體管理、叢集模式與適用場景

     編輯:PHP 相關知識

Memcached 是什麼?

**高效能、分散式、記憶體內、Key-Value** 快取系統。非關聯式、無持久化、無備份、無認證 (預設)、單執行緒事件驅動 (libevent)。

核心架構特性

特性說明
分散式Client 端一致性哈希決定 Key 所在節點,Server 端互不通訊、無同步、無單點故障
記憶體內所有資料在 RAM,微秒級存取,重啟即遺失
單執行緒 + libevent單進程單執行緒處理所有連線,避免鎖競爭,C10k 級並發 (受限於 CPU 核心數)
Slab Allocator 記憶體管理預先劃分固定大小 Chunk (Class),消除碎片,但可能造成空間浪費 (因子 1.25 默認)
LRU 淘汰每個 Slab Class 獨立 LRU,全域無統一 LRU
協定ASCII (文本、除錯易) / Binary (高效、支援 CAS、Pipeline)

記憶體管理深度:Slab Allocator

# 概念
Page (1MB) → 切割成 Chunk (固定大小) → 同大小 Chunk 組成 Slab Class
# 例:Factor 1.25, 最小 96B
Class 1: 96B   → 10922 chunks/page
Class 2: 120B  → 8738 chunks/page
Class 3: 150B  → 6990 chunks/page
...
# 新增資料 → 依大小找 Class → 從 free list 取 chunk → 無則申請新 Page 切割
# 問題:100B 資料佔 120B chunk → 20B 浪費 (內部碎片)
# 優化:調整 -f factor (如 1.1)、-n min chunk size、預熱 slab
?>

叢集擴展模式

  1. Client 端一致性哈希 (標準):Ketama 演算法,節點增減只影響少量 Key 遷移。PHP `Memcached::DISTRIBUTION_CONSISTENT`。
  2. Proxy 層 (Twemproxy / Mcrouter):Client 連 Proxy,Proxy 路由至後端叢集。支援連線池、請求合併、故障轉移、多資料中心。
  3. Client 直連 + 服務發現:Consul/Etcd 註冊節點,Client 動態更新 Server List。

適用 vs 不適用場景

✅ 適用❌ 不適用
高頻讀、低頻寫的熱點資料 (Session、使用者資訊、設定、計數器)需持久化、需交易 (ACID)、需複雜查詢 (JOIN、WHERE)
資料可重建、可容忍遺失 (快取層定位)資料為唯一權威來源 (如訂單、帳務)
Key-Value 存取模式需掃描、篩選、排序 (需 Redis Sorted Set / ES)
單值 < 1MB (建議 < 100KB)大物件 (影片、大圖) → 儲存至 S3/CDN,快取存 URL

常見誤區

  1. 當資料庫用:無持久化、無備份、重啟全掛。**永遠要有回源策略 (DB/服務)**。
  2. 忽略 Key 設計:過長 Key 消耗記憶體/網路、無規範難維護、熱 Key 導致單節點熱點。
  3. 預設配置上線:預設 64MB 記憶體、1024 連線、無 SASL 認證、TCP 延遲 (Nagle) 開啟。**必須調優**。
  4. 混用 ASCII/Binary 協定:Client 庫預設可能不同,統一指定 Binary。

監控關鍵指標 (Prometheus Exporter)

  • `memcached_uptime_seconds`、
  • `memcached_limit_maxbytes` / `memcached_bytes` (記憶體使用率)
  • `memcached_get_hits_total` / `memcached_get_misses_total` (命中率)
  • `memcached_evictions_total` (驅逐率)
  • `memcached_curr_connections` / `memcached_listen_disabled_num` (連線壓力)
  • `memcached_threads` (通常為 1,若 >1 表示編譯支援多執行緒)

總結

Memcached 以**極致簡單**換取**極致效能**:單執行緒、Slab 記憶體、LRU、Client 端分片。理解其架構限制 (無持久化、無複雜查詢、單執行緒瓶頸),定位為**「可丟失的高速快取層」**,配合合理的 Key 設計、叢集架構、監控告警,即能發揮最大價值。

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