起
最近在做一個WEB的數據統計的優化,但是由於數據量大,執行一次SQL統計要 比較長的時間(一般700ms算是正常)。
正常的做法只要加個緩存就好了。
但是同時業務要求此數據最多1分鐘就要更新,而且這一分種內數據可能會有 較多變化(而且原系統不太易擴展)。
也就是說緩存1分鐘就要失效重新統計,而且用戶訪問這頁還很是頻繁,如果 使用一般緩存那麼用戶體驗很差而且很容易造成超時。
承
看到以上需求,第一個進入我大腦的就是從前做游戲時接觸到的DDraw的雙緩 沖顯示方式。
在第一幀顯示的同時,正在計算第二幀,這樣讀取和計算就可以分開了,也就 避免了讀取時計算,提高了用戶體驗。
我想當然我們也可以將這種方式用於緩存的策略中,但這樣用空間換取時間的 方式還是得權衡的,因為並不是所有時候都值得這麼做,但這裡我覺得這樣做應 該是最好的方式了。
注:為了可以好好演示,本篇中的緩存都以IEnumerable的形式來存儲,當然 這個文中原理也可以應用在WebCache中。
這裡我使用以下數據結構做為存儲單元:
namespace CHCache { /// <summary> /// 緩存介質 /// </summary> public class Medium { /// <summary> /// 主要存儲介質 /// </summary> public object Primary { get; set; } /// <summary> /// 次要存儲介質 /// </summary> public object Secondary { get; set; } /// <summary> /// 是否正在使用主要存儲 /// </summary> public bool IsPrimary { get; set; } /// <summary> /// 是否正在更新 /// </summary> public bool IsUpdating { get; set; } /// <summary> /// 是否更新完成 /// </summary> public bool IsUpdated { get; set; } } }
有了這個數據結構我們就可以將數據實現兩份存儲。再利用一些讀寫策略就可 以實現上面我們講的緩存方式。