優秀的 PHP 架構師知道:緩存是系統效能的放大器,但錯誤的緩存策略會帶來資料不一致、快取雪崩、穿透等災難。本文梳理從程式碼層到基礎設施層的完整緩存體系。
核心邏輯:檢查緩存 → 命中返回 → 未命中查 DB → 序列化存檔/存表 → 返回。
流程:請求 → 檢查靜態檔案是否存在且未過期 → 是:直接輸出 → 否:執行邏輯 → 輸出緩衝區捕獲 → 存檔 → 輸出。
Smarty、Blade、Twig 等模板引擎內建 {cache} 區塊或全頁緩存功能。
| 策略 | 觸發條件 | 適用場景 | 風險 |
|---|---|---|---|
| 時間觸發(TTL) | 檔案 mtime < now - TTL | 資訊流、報表、非即時頁面 | 髒讀窗口 = TTL |
| 內容觸發(主動失效) | 資料寫入/更新/刪除時主動刪除/重建緩存 | 電商庫存、用戶資料、即時性要求高 | 寫入路徑複雜、分散式環境需分散式鎖 |
定時任務或發布系統生成純 HTML,Nginx 直接服務,完全繞過 PHP-FPM。適合:文章詳情、商品詳情、幫助中心等極少變更頁面。
特點:Key-Value 純記憶體、多執行緒、LRU 淘汰、無持久化、Client 端一致性雜湊分片。
<?php
$mem = new Memcached(); // 推薦用 Memcached(非舊版 memcache)
$mem->addServer('127.0.0.1', 11211);
$key = 'user:profile:1001';
$data = $mem->get($key);
if ($data === false) { // 未命中
$data = $db->query("SELECT * FROM users WHERE id=1001");
$mem->set($key, $data, 300); // 5 分鐘 TTL
}
var_dump($data);
set($key, '', 60))+ 布隆過濾器攔截不存在 Key。300 + rand(0, 60))、多級緩存(本地 Redis + 遠端 Memcached)、熔斷降級。if ($mem->add("lock:$key", 1, 10)) { rebuild(); $mem->delete("lock:$key"); } else { sleep(rand(10,50)/1000); retry(); }serialize;高效能場景改用 igbinary、msgpack、protobuf。支援 String、Hash、List、Set、Sorted Set、Stream、Geo、HyperLogLog、Bitmap;持久化(RDB/AOF)、主從複制、Sentinel/Cluster 高可用、Lua 腳本原子操作。
現代 PHP 專案首選 Redis,Memcached 僅用於純 KV、極簡場景。
Cache-Control: public, max-age=31536000)。ETag / Last-Modified 協商緩存 + Cache-Control: max-age 強緩存。hits / (hits + misses) 目標 > 95%(視業務而定)。redis-cli --stat、Prometheus + Grafana、Datadog、New Relic。原文整理自《PHP企業級應用之常見緩存技術篇》,補充現代 Redis/Memcached 最佳實踐、一致性方案與觀測體系。