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 失敗,保持緩存不變(繼續服務舊數據)或直接返回錯誤,避免髒數據污染。
緩存能提升性能,但若缺乏數據質量守門,反而會放大故障影響面。這個「只多加一行 if」的修復,卻能避免生產環境的嚴重事故。寫緩存前,請三思:這數據,真的能用嗎?