前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[NewLife.XCode]脏数据

[NewLife.XCode]脏数据

作者头像
大石头
发布2019-05-24 20:29:33
8070
发布2019-05-24 20:29:33
举报
文章被收录于专栏:智能大石头

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就是第一种强类型脏数据和第三种弱类型赋值两者优点的混合体!

脏数据效果

代码语言:javascript
复制
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原子操作,拥有最好的性能以及最小内存占用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是脏数据
  • 设置脏数据
  • 脏数据效果
  • 使用脏数据
  • 实现原理
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档