[NewLife.XCode]脏数据
NewLife.XCode是一個有10多年歷史的開源數(shù)據(jù)中間件,支持nfx/netstandard,由新生命團(tuán)隊(duì)(2002~2019)開發(fā)完成并維護(hù)至今,以下簡稱XCode。
整個系列教程會大量結(jié)合示例代碼和運(yùn)行日志來進(jìn)行深入分析,蘊(yùn)含多年開發(fā)經(jīng)驗(yàn)于其中,代表作有百億級大數(shù)據(jù)實(shí)時計算項(xiàng)目。
開源地址:https://github.com/NewLifeX/X?(求star, 729+)
?
回到目錄
什么是臟數(shù)據(jù)
在XCode中,每次執(zhí)行實(shí)體類更新entity.Update時,都希望只更新修改過的字段,而不是update所有字段。
一方面,減少數(shù)據(jù)庫壓力以及通信流量;
另一方面,多線程同時更新同一行數(shù)據(jù)的不同字段,在未加鎖的情況下,避免臟寫。
?
IsDirty和Dirtys,這是XCode的臟數(shù)據(jù),常常出現(xiàn)在Valid中 。
如上圖,前者判斷Password字段是否有臟數(shù)據(jù)(Password被賦予跟原來不想等的值),后者清空Password臟數(shù)據(jù)。
臟數(shù)據(jù)是生成Update語句的核心,不臟的字段不會出現(xiàn)在update set?之中,從而實(shí)現(xiàn)部分字段更新。
?
回到目錄
設(shè)置臟數(shù)據(jù)
臟數(shù)據(jù)是XCode實(shí)體類內(nèi)置功能,每一個實(shí)體類屬性set操作中都帶有臟數(shù)據(jù)邏輯。
實(shí)體類屬性并非普通屬性,而是帶有OnPropertyChanging邏輯?
這里是臟數(shù)據(jù)的默認(rèn)設(shè)置點(diǎn),先比較新舊值是否一致,如果一致,顯然不會設(shè)置臟數(shù)據(jù)。
實(shí)體屬性數(shù)值是否相等比較邏輯:
整數(shù)全部轉(zhuǎn)換為Int64比較,避免因類型不同而誤判
時間日期只比較年月日時分秒,而不比較毫秒等其它部分
字符串比較時,null與empty相等
浮點(diǎn)數(shù)比較(單精度和雙精度),比較到小數(shù)點(diǎn)后6位
Decimal比較到小數(shù)點(diǎn)后12位
使用代碼來表達(dá),大概是下面的樣子:
實(shí)體類屬性賦值有三種方法:
user.Password = "Stone"
user.SetItem("Password", "Stone")
user["Password"] = "Stone"
?主要功能相似,都是給Password字段賦值。
最大的不同點(diǎn)在于:后者一定不會設(shè)置臟數(shù)據(jù),僅僅是簡單賦值;前面兩個可能會設(shè)置臟數(shù)據(jù),要求Password原值不等于"Stone"時才會設(shè)置臟數(shù)據(jù)。
* SetItem就是第一種強(qiáng)類型臟數(shù)據(jù)和第三種弱類型賦值兩者優(yōu)點(diǎn)的混合體!
?
回到目錄
臟數(shù)據(jù)效果
Update User Set Mobile='13012345678', Code='abcdef' Where ID=74如上,修改了3個字段,但是Name本來就是“張三”,因此實(shí)際上只修改了兩個字段,也就是說只有兩個字段有臟數(shù)據(jù)(數(shù)值改變被弄臟了)。
最終生成的update set語句,只包含帶有臟數(shù)據(jù)的字段。最后的where部分,則由主鍵組成。
?
回到目錄
使用臟數(shù)據(jù)
臟數(shù)據(jù)最常見于數(shù)據(jù)驗(yàn)證Valid中,可以用來判斷某個屬性否則曾經(jīng)被修改過
如上,兩次用到臟數(shù)據(jù),如果業(yè)務(wù)代碼沒有設(shè)置用戶名或創(chuàng)建時間,則在Valid時設(shè)置。
因此,臟數(shù)據(jù)往往用于給字段設(shè)置默認(rèn)值。除了可用于實(shí)體類Valid,還可以用于實(shí)體過濾器EntityModule.Valid。
?
判斷臟數(shù)據(jù)有兩種辦法 Dirtys["CreateTime"]?和 IsDirty("CreateTime") 。上面的__.CreateTime實(shí)質(zhì)上就是"CreateTime"常量,僅僅是為了避免用戶寫錯單詞。
在大數(shù)據(jù)分析處理場合,數(shù)百萬實(shí)體對象位于內(nèi)存之中,Dirtys將導(dǎo)致每個實(shí)體對象附帶實(shí)例化一個臟數(shù)據(jù)集合對象,而IsDirty則不會,因此效果更好。
?
回到目錄
實(shí)現(xiàn)原理
第一代臟數(shù)據(jù)實(shí)現(xiàn)就是字典 Dictionary<String, Boolean>,后來發(fā)現(xiàn)在高并發(fā)性頻繁出現(xiàn)多線程沖突;
第二代臟數(shù)據(jù)實(shí)現(xiàn)是并行字典ConcurrentDictionary<String, Boolean>,后來在大數(shù)據(jù)分析處理中發(fā)現(xiàn),單個并行字典,哪怕是空的,也要占用約2k內(nèi)存空間;
第三代臟數(shù)據(jù)實(shí)現(xiàn)?DirtyCollection,采用了內(nèi)置數(shù)組以及CAS原子操作,擁有最好的性能以及最小內(nèi)存占用。
?
回到目錄
系列教程
NewLife.XCode教程系列[2019版]
增刪改查入門??焖僬宫F(xiàn)用法,代碼配置連接字符串
數(shù)據(jù)模型文件。建立表格字段和索引,名字以及數(shù)據(jù)類型規(guī)范,推薦字段(時間,用戶,IP)
實(shí)體類詳解。數(shù)據(jù)類業(yè)務(wù)類,泛型基類,接口
功能設(shè)置。連接字符串,調(diào)試開關(guān),SQL日志,慢日志,參數(shù)化,執(zhí)行超時。代碼與配置文件設(shè)置,連接字符串局部設(shè)置
反向工程。自動建立數(shù)據(jù)庫數(shù)據(jù)表
數(shù)據(jù)初始化。InitData寫入初始化數(shù)據(jù)
高級增刪改。重載攔截,自增字段,Valid驗(yàn)證,實(shí)體模型(時間,用戶,IP)
臟數(shù)據(jù)。如何產(chǎn)生,怎么利用
增量累加。高并發(fā)統(tǒng)計
事務(wù)處理。單表和多表,不同連接,多種寫法
擴(kuò)展屬性。多表關(guān)聯(lián),Map映射
高級查詢。復(fù)雜條件,分頁,自定義擴(kuò)展FieldItem,查總記錄數(shù),查匯總統(tǒng)計
數(shù)據(jù)層緩存。Sql緩存,更新機(jī)制
實(shí)體緩存。全表整理緩存,更新機(jī)制
對象緩存。字典緩存,適用用戶等數(shù)據(jù)較多場景。
百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
實(shí)體工廠。元數(shù)據(jù),通用處理程序
角色權(quán)限。Membership
導(dǎo)入導(dǎo)出。Xml,Json,二進(jìn)制,網(wǎng)絡(luò)或文件
分表分庫。常見拆分邏輯
高級統(tǒng)計。聚合統(tǒng)計,分組統(tǒng)計
批量寫入。批量插入,批量Upsert,異步保存
實(shí)體隊(duì)列。寫入級緩存,提升性能。
備份同步。備份數(shù)據(jù),恢復(fù)數(shù)據(jù),同步數(shù)據(jù)
數(shù)據(jù)服務(wù)。提供RPC接口服務(wù),遠(yuǎn)程執(zhí)行查詢,例如SQLite網(wǎng)絡(luò)版
大數(shù)據(jù)分析。ETL抽取,調(diào)度計算處理,結(jié)果持久化
?
總結(jié)
以上是生活随笔為你收集整理的[NewLife.XCode]脏数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [NewLife.XCode]增量累加
- 下一篇: 你真的了解用户吗?-浅谈《用户画像》的意