前一段時間,我寫了篇《移花接木:當泛型方法遇上抽象類別----我的“記憶體資料庫”誕生記 》,記錄了PDF.NET記憶體資料庫的設計過程,最近做了些小改動,已經投入生產使用了,目前運行良好。今天重新看了看源碼,覺得有必要畫一個記憶體資料庫的架構圖,因為整個程式的核心代碼加上詳細的檔案注釋,才391行代碼,時間長了恐怕無法瞭解整個程式的設計思路。
先直接,再說明架構的設計問題:
(PDF.NET記憶體資料庫結構描述圖)
架構說明
1,核心類 MemDB
- 一個儲存所有實體類集合的集合,即Memory Data,應用程式要取資料,通過Get<T>方法擷取(T為實體類類型);
- 當擷取資料的時候,如發現Memory Data裡面沒有,就調用Load<T>方法,從PMDb實體類檔案載入資料;
- 當有新實體資料需要儲存的時候,調用Add<T>方法;
- 當資料更新以後,如果想儲存,就顯式的調用一下Save<T>方法,注意,該方法並不直接儲存資料,它只儲存這個“儲存資料的方法”,參見“移花接木”一文的說明;
- 後台維護一個資料寫入線程,檢查是否有“儲存資料的方法”需要執行;
- 資料操作的日誌記錄。
2,核心類 MemDBEngin
該類實際上就是一個MemDB的工廠類,它會根據不同的資料庫“路徑”產生一個MemDB對象執行個體;
MemDB執行個體的生命週期由“系統緩衝”管理,這裡使用.NET 4.0的System.Runtime.Caching裡面的緩衝管理對象。
由於使用了系統緩衝,所以MemDB能夠做到“按需載入”,“閑置關閉”的功能。
MemDB執行個體中的Memory Data對應的就是“系統緩衝”。
3,ICacheProvider 緩衝提供者介面
定義了一套緩衝使用的方法,可以指定緩衝策略,如相對到期、絕對到期等。
4,緩衝提供者
系統緩衝的預設實現了Memory CacheProvider ,也就是記憶體緩衝提供者;由於採用介面設計,所以理論上也可以擴充為第三方的“分布式緩衝”。
5,資料持久化
整個記憶體資料庫使用的資料都是PDF.NET的實體類,這裡使用PDF.NET架構的“序列化”和“還原序列化”功能,將記憶體資料寫入磁碟上的pmdb檔案,或者從檔案載入資料到記憶體中。
6,使用者應用程式
這裡是使用“記憶體資料庫”的資料的地方,可以使用多種方式來操作記憶體資料,比如直接使用Linq To Object來查詢記憶體中的資料,或者使用PDF.NET的EntityQuery對象,實現記憶體資料庫和“關聯式資料庫系統”(DBMS)的資料庫間的雙向同步。實際使用中,可以完全拋棄DBMS,使用Linq To Object已經足夠了。
7,PDF.NET Entity Object
這是整個系統使用的實體資料了,它由相關的組件調用傳遞。由於PDF.NET實體類的獨特設計,使得它的序列化和還原序列化效率非常高,另外不使用反射,效能也很好,而且,最重要的,它沒有關聯式資料庫那一套“沉重”的資料庫中繼資料標識,所以它非常輕巧,適合作為記憶體資料庫資料的最佳載體。
系統的伸縮能力
縱觀整個系統的設計,可以看到它有很好的擴充能力:
- 大型應用--可以很方便的擴充支援第三方分布式緩衝,構建大型的系統應用;
- 中小型應用--也可以將常用的DBMS資料放在記憶體資料庫中,提高響應能力;
- 輕微型應用--可以完全拋棄DBMS,使用純記憶體資料庫,以獲得最大的響應速度。
有關PDF.NET開發架構的詳細內容,請看官網 http://www.pwmis.com/sqlmap
記憶體資料庫目前已經投入生產使用,即將整合在PDF.NET架構的下一個版本中。