NewLife.XCode是一個有10多年曆史的開源資料中介軟體,支援nfx/netstandard,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。
整個系列教程會大量結合示例程式碼和執行日誌來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大資料實時計算專案。
開源地址:https://github.com/NewLifeX/X (求star, 729+)
回到目錄
什麼是臟資料
在XCode中,每次執行物體類更新entity.Update時,都希望只更新修改過的欄位,而不是update所有欄位。
一方面,減少資料庫壓力以及通訊流量;
另一方面,多執行緒同時更新同一行資料的不同欄位,在未加鎖的情況下,避免臟寫。
IsDirty和Dirtys,這是XCode的臟資料,常常出現在Valid中 。
如上圖,前者判斷Password欄位是否有臟資料(Password被賦予跟原來不想等的值),後者清空Password臟資料。
臟資料是生成Update陳述句的核心,不髒的欄位不會出現在update set 之中,從而實現部分欄位更新。
回到目錄
設定臟資料
臟資料是XCode物體類內建功能,每一個物體類屬性set操作中都帶有臟資料邏輯。
物體類屬性並非普通屬性,而是帶有OnPropertyChanging邏輯
這裡是臟資料的預設設定點,先比較新舊值是否一致,如果一致,顯然不會設定臟資料。
物體屬性數值是否相等比較邏輯:
- 整數全部轉換為Int64比較,避免因型別不同而誤判
- 時間日期只比較年月日時分秒,而不比較毫秒等其它部分
- 字串比較時,null與empty相等
- 浮點數比較(單精度和雙精度),比較到小數點後6位
- Decimal比較到小數點後12位
使用程式碼來表達,大概是下麵的樣子:
物體類屬性賦值有三種方法:
- user.Password = “Stone”
- user.SetItem(“Password”, “Stone”)
- user[“Password”] = “Stone”
主要功能相似,都是給Password欄位賦值。
最大的不同點在於:後者一定不會設定臟資料,僅僅是簡單賦值;前面兩個可能會設定臟資料,要求Password原值不等於”Stone”時才會設定臟資料。
* SetItem就是第一種強型別臟資料和第三種弱型別賦值兩者優點的混合體!
回到目錄
臟資料效果
Update User Set Mobile='13012345678', Code='abcdef' Where ID=74
如上,修改了3個欄位,但是Name本來就是“張三”,因此實際上只修改了兩個欄位,也就是說只有兩個欄位有臟資料(數值改變被弄髒了)。
最終生成的update set陳述句,只包含帶有臟資料的欄位。最後的where部分,則由主鍵組成。
回到目錄
使用臟資料
臟資料最常見於資料驗證Valid中,可以用來判斷某個屬性否則曾經被修改過
如上,兩次用到臟資料,如果業務程式碼沒有設定使用者名稱或建立時間,則在Valid時設定。
因此,臟資料往往用於給欄位設定預設值。除了可用於物體類Valid,還可以用於物體過濾器EntityModule.Valid。
判斷臟資料有兩種辦法 Dirtys[“CreateTime”] 和 IsDirty(“CreateTime”) 。上面的__.CreateTime實質上就是”CreateTime”常量,僅僅是為了避免使用者寫錯單詞。
在大資料分析處理場合,數百萬物體物件位於記憶體之中,Dirtys將導致每個物體物件附帶實體化一個臟資料集合物件,而IsDirty則不會,因此效果更好。
回到目錄
實現原理
第一代臟資料實現就是字典 Dictionary,後來發現在高併發性頻繁出現多執行緒衝突;
第二代臟資料實現是並行字典ConcurrentDictionary,後來在大資料分析處理中發現,單個並行字典,哪怕是空的,也要佔用約2k記憶體空間;
第三代臟資料實現 DirtyCollection,採用了內建陣列以及CAS原子操作,擁有最好的效能以及最小記憶體佔用。
回到目錄
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,程式碼配置連線字串
- 資料模型檔案。建立表格欄位和索引,名字以及資料型別規範,推薦欄位(時間,使用者,IP)
- 物體類詳解。資料類業務類,泛型基類,介面
- 功能設定。連線字串,除錯開關,SQL日誌,慢日誌,引數化,執行超時。程式碼與配置檔案設定,連線字串區域性設定
- 反向工程。自動建立資料庫資料表
- 資料初始化。InitData寫入初始化資料
- 高階增刪改。多載攔截,自增欄位,Valid驗證,物體模型(時間,使用者,IP)
- 臟資料。如何產生,怎麼利用
- 增量累加。高併發統計
- 事務處理。單表和多表,不同連線,多種寫法
- 擴充套件屬性。多表關聯,Map對映
- 高階查詢。複雜條件,分頁,自定義擴充套件FieldItem,查總記錄數,查彙總統計
- 資料層快取。Sql快取,更新機制
- 物體快取。全表整理快取,更新機制
- 物件快取。字典快取,適用使用者等資料較多場景。
- 百億級效能。欄位精煉,索引完備,合理查詢,充分利用快取
- 物體工廠。元資料,通用處理程式
- 角色許可權。Membership
- 匯入匯出。Xml,Json,二進位制,網路或檔案
- 分表分庫。常見拆分邏輯
- 高階統計。聚合統計,分組統計
- 批次寫入。批次插入,批次Upsert,非同步儲存
- 物體佇列。寫入級快取,提升效能。
- 備份同步。備份資料,恢復資料,同步資料
- 資料服務。提供RPC介面服務,遠端執行查詢,例如SQLite網路版
- 大資料分析。ETL抽取,排程計算處理,結果持久化
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。