隨著網站流量增長,越來多 .NET 開發者放棄 ASP.NET 內建快取機制,改用 Memcached——一種高效能的分散式記憶體快取系統。Memcached 最初由 Danga Interactive 為 LiveJournal 開發,現已成為大型網站架構的標準組件。
ASP.NET 內建快取在單一伺服器環境下運作良好,但在 Web Farm(多伺服器叢集)中卻面臨嚴重問題:每台伺服器的快取彼此獨立,無法感知其他伺服器的資料變更。雖然 ASP.NET 提供檔案系統與資料庫觸發器作為快取失效機制,但資料庫觸發器需要昂貴的輪詢機制,且程式撰寫繁瑣。
Richard Jones 指出,隨著節點增加,get_multi 函式效用遞減,因單一頁面可能需存取幾乎所有 Memcached 實例。Facebook 採用叢集分區策略(如將所有使用者資料集中在特定子節點群 mc)以提升 get_multi 效能。
推薦解決方案:不依快取項目關鍵字產生雜湊鍵值,而是依據資料儲存位置生成雜湊,讓同一頁面所需的所有快取項目盡量落在同一台伺服器。但此演算法實作較易出錯,需謹慎設計。