我讀取緩存單元的邏輯是這樣的:
從2個不同緩存讀取當(dāng)然是很容易了,但是比較復(fù)雜的就是向緩存寫入的過程:
這里讀取數(shù)據(jù)以及寫入緩存時我使用了一個委托,在其它線程中僅在需要執(zhí)行時才會執(zhí)行。
這里除了首次寫入緩存占用主線程時間(讀取要等待)以外,其它時間都可以無延時的讀取,實(shí)現(xiàn)了無縫的緩存。
但我們在委托中要操作緩存的元素Medium,所以要傳遞參數(shù)進(jìn)其它線程,所以我這里使用了一個輔助類來傳遞參數(shù)進(jìn)入其它線程:
using System; namespace CHCache { /// <summary> /// 一個線程Helper,用于幫助多拋出線程時傳遞參數(shù) /// </summary> public class ThreadHelper { Func<object> Fun { get; set; } Medium Medium { get; set; } /// <summary> /// 通過構(gòu)造函數(shù)來傳遞參數(shù) /// </summary> /// <param name="m">緩存單元</param> /// <param name="fun">讀取數(shù)據(jù)的委托</param> public ThreadHelper(Medium m,Func<object> fun) { Medium = m; Fun = fun; } /// <summary> /// 線程入口,ThreadStart委托所對應(yīng)的方法 /// </summary> public void Doit() { Medium.IsUpdating = true; if (Medium.IsPrimary) { Console.WriteLine("Begin write to 2."); var ret = Fun.Invoke(); Medium.Secondary = ret; Console.WriteLine("End write to 2."); } else { Console.WriteLine("Begin write to 1."); var ret = Fun.Invoke(); Medium.Primary = ret; Console.WriteLine("End write to 1."); } Medium.IsUpdated = true; Medium.IsUpdating = false; } } }
這樣我們就實(shí)現(xiàn)了在另個線程讀取數(shù)據(jù)的過程,這樣就在任何時候讀取數(shù)據(jù)時都會無延時直接讀取了。
結(jié)
最后我們寫一個主函數(shù)來測試一下效果
/* * http://www.cnblogs.com/chsword/ * chsword * Date: 2009-3-31 * Time: 16:53 */ using System; using System.Threading; namespace CHCache { class Program { public static void Main(string[] args) { var cache = new DictionaryCache(); Console.WriteLine("Init...4s,you can press the CTRL+C to close the console window."); while (true) { cache.Add("1", GetValue); Thread.Sleep(1000); Console.WriteLine(cache["1"]); } } /// <summary> /// 獲取數(shù)據(jù)的方法,假設(shè)是從數(shù)據(jù)庫讀取的,費(fèi)時約4秒 /// </summary> /// <returns></returns> static object GetValue() { Thread.Sleep(4000); return DateTime.Now; } } }
得到如下數(shù)據(jù):
這樣就實(shí)現(xiàn)了平滑的讀取緩存數(shù)據(jù)而沒有任何等待時間
當(dāng)然這里還有些問題,比如說傳遞不同參數(shù)時的解決方法,但是由于我僅是在一個統(tǒng)計(jì)時需要這種緩存提高性能,所以暫沒有考慮通用的傳參方式。
如果大家對這個話題感興趣,歡迎討論。
示例下載:CHCache.rar(點(diǎn)擊下載)
本文鏈接:http://m.95time.cn/tech/program/2009/6569.asp
出處:重典的博客
責(zé)任編輯:bluehearts
上一頁 無縫的緩存讀取:雙存儲緩存策略 [1] 下一頁
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|