場景:統計查詢耗時 700ms,業務要求 1 分鐘內資料必須更新,高頻訪問下單一快取失效會造成大量請求同步重建(Cache Stampede),導致超時、體驗差。
借鑑 DirectDraw 雙緩衝:前緩衝顯示、後緩衝繪製,交換指標零等待。套用至快取:
IsPrimary 標誌 → 新資料立即生效,舊資料成為下一次重建目標。
public class Medium
{
public object Primary { get; set; }
public object Secondary { get; set; }
public bool IsPrimary { get; set; } // 目前服務中的是 Primary 還是 Secondary
public bool IsUpdating { get; set; } // 是否正在重建
public bool IsUpdated { get; set; } // 重建是否完成
}
IsPrimary,回傳對應物件(無鎖、極快)。!IsUpdating 且需更新 → 設 IsUpdating=true、在 Secondary 重建、完成後 IsUpdated=true、原子切換 IsPrimary、清旗標。IsUpdating 防止多執行緒同時重建。適用於「高頻讀、定期重建、容忍秒級舊資料」場景。空間換時間,極大平滑失效尖峰。