歡迎光臨
每天分享高質量文章

[NewLife.XCode]臟資料

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版]

  1. 增刪改查入門。快速展現用法,代碼配置連接字串
  2. 資料模型檔案。建立表格欄位和索引,名字以及資料型別規範,推薦欄位(時間,用戶,IP)
  3. 物體類詳解。資料類業務類,泛型基類,接口
  4. 功能設置。連接字串,除錯開關,SQL日誌,慢日誌,引數化,執行超時。代碼與配置檔案設置,連接字串區域性設置
  5. 反向工程。自動建立資料庫資料表
  6. 資料初始化。InitData寫入初始化資料
  7. 高級增刪改。多載攔截,自增欄位,Valid驗證,物體模型(時間,用戶,IP)
  8. 臟資料。如何產生,怎麼利用
  9. 增量累加。高併發統計
  10. 事務處理。單表和多表,不同連接,多種寫法
  11. 擴展屬性。多表關聯,Map映射
  12. 高級查詢。複雜條件,分頁,自定義擴展FieldItem,查總記錄數,查彙總統計
  13. 資料層快取。Sql快取,更新機制
  14. 物體快取。全表整理快取,更新機制
  15. 物件快取。字典快取,適用用戶等資料較多場景。
  16. 百億級性能。欄位精煉,索引完備,合理查詢,充分利用快取
  17. 物體工廠。元資料,通用處理程式
  18. 角色權限。Membership
  19. 匯入匯出。Xml,Json,二進制,網絡或檔案
  20. 分表分庫。常見拆分邏輯
  21. 高級統計。聚合統計,分組統計
  22. 批量寫入。批量插入,批量Upsert,異步儲存
  23. 物體佇列。寫入級快取,提升性能。
  24. 備份同步。備份資料,恢復資料,同步資料
  25. 資料服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
  26. 大資料分析。ETL抽取,調度計算處理,結果持久化

 

受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可通過二維碼轉賬支持公眾號。

    赞(0)

    分享創造快樂