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

PHP 緩存陷阱:當空數據被誤存入緩存導致業務癱瘓

     編輯:PHP 相關知識

一段看似正常的緩存代碼

public function getCoinSetting() {
    $cache = Common::getTair();
    $ckey  = Common::hashKey("Hello");
    $ret   = $cache->get($ckey);
    if ($ret) return json_decode($ret, true);

    $taomanyiApiService = $this->_getTmiApiService();
    $result = $taomanyiApiService->getCoinSetting();
    $cache->set($ckey, json_encode($result), 3600);
    return $result;
}

這段代碼邏輯清晰:先查緩存,未命中則調用 API 獲取數據,寫入緩存並返回。緩存過期時間設為 3600 秒(1 小時)。

隱藏的致命缺陷

API 呼叫 $taomanyiApiService->getCoinSetting() 依賴 HTTP 請求,網絡波動、服務異常、超時等情況極其常見。一旦 API 返回 null、false 或空陣列,代碼會直接執行:

$cache->set($ckey, json_encode($result), 3600);

空數據被寫入緩存! 接下來一小時內,所有請求都將讀取到這個「空值」,導致前端頁面分類數據空白、業務流程中斷。

修正方案:寫入前必須驗證數據有效性

if ($result) {
    $cache->set($ckey, json_encode($result), 3600);
}

僅在 $result 非空、非 false 時才更新緩存。若 API 失敗,保持緩存不變(繼續服務舊數據)或直接返回錯誤,避免髒數據污染。

延伸思考:緩存防禦性編程原則

  • 永不信任外部數據源:API、DB、RPC 皆可能返回異常值。
  • 寫入緩存前必須校驗:業務邏輯層面的「有效性」而非單純的「非 null」。
  • 考慮「快速失效」與「熔斷」:連續失敗時停止寫入,保護緩存層純淨度。
  • 設置合理的過期策略:短過期 + 隨機抖動,防止緩存雪崩。

總結

緩存能提升性能,但若缺乏數據質量守門,反而會放大故障影響面。這個「只多加一行 if」的修復,卻能避免生產環境的嚴重事故。寫緩存前,請三思:這數據,真的能用嗎?

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