日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[NewLife.XCode]脏数据

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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<String, Boolean>,后來發現在高并發性頻繁出現多線程沖突;

第二代臟數據實現是并行字典ConcurrentDictionary<String, Boolean>,后來在大數據分析處理中發現,單個并行字典,哪怕是空的,也要占用約2k內存空間;

第三代臟數據實現?DirtyCollection,采用了內置數組以及CAS原子操作,擁有最好的性能以及最小內存占用。

?

回到目錄

系列教程

NewLife.XCode教程系列[2019版]

  • 增刪改查入門。快速展現用法,代碼配置連接字符串

  • 數據模型文件。建立表格字段和索引,名字以及數據類型規范,推薦字段(時間,用戶,IP)

  • 實體類詳解。數據類業務類,泛型基類,接口

  • 功能設置。連接字符串,調試開關,SQL日志,慢日志,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置

  • 反向工程。自動建立數據庫數據表

  • 數據初始化。InitData寫入初始化數據

  • 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)

  • 臟數據。如何產生,怎么利用

  • 增量累加。高并發統計

  • 事務處理。單表和多表,不同連接,多種寫法

  • 擴展屬性。多表關聯,Map映射

  • 高級查詢。復雜條件,分頁,自定義擴展FieldItem,查總記錄數,查匯總統計

  • 數據層緩存。Sql緩存,更新機制

  • 實體緩存。全表整理緩存,更新機制

  • 對象緩存。字典緩存,適用用戶等數據較多場景。

  • 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存

  • 實體工廠。元數據,通用處理程序

  • 角色權限。Membership

  • 導入導出。Xml,Json,二進制,網絡或文件

  • 分表分庫。常見拆分邏輯

  • 高級統計。聚合統計,分組統計

  • 批量寫入。批量插入,批量Upsert,異步保存

  • 實體隊列。寫入級緩存,提升性能。

  • 備份同步。備份數據,恢復數據,同步數據

  • 數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版

  • 大數據分析。ETL抽取,調度計算處理,結果持久化

  • ?


    總結

    以上是生活随笔為你收集整理的[NewLife.XCode]脏数据的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。