专栏首页智能大石头[NewLife.XCode]脏数据

[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原子操作,拥有最好的性能以及最小内存占用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [NewLife.XCode]高级增删改

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简...

    大石头
  • [NewLife.XCode]实体类详解

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。

    大石头
  • [NewLife.XCode]实体工厂(拦截处理实体操作)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCo...

    大石头
  • [NewLife.XCode]事务处理(算准你的每一分钱)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简...

    大石头
  • [NewLife.XCode]百亿级性能

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCo...

    大石头
  • [NewLife.XCode]增量累加

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简...

    大石头
  • [NewLife.XCode]对象字典缓存(百万军中取敌首级)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCo...

    大石头
  • 数据映射组件NewLife.XCode优势

    数据映射组件XCode优势 XCode是一个超越了ORM范围的映射组件,除了对象到关系数据库的映射外,还有到网络和其它二进制形式等的映射,所以称之为数据映射组件...

    大石头
  • 性能&分布式&NewLife.XCode对无限数据的支持

    上周发布了《改进版CodeTimer及XCode性能测试》,展示了NewLife.XCode在性能上的表现。实际上NewLife.XCode是一个很平凡的ORM...

    大石头
  • [NewLife.XCode]导入导出(实体对象百变魔君)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCo...

    大石头
  • 在XCode中如何使用高级查询

    对于一个框架来说,仅有基本的CURD不行,NewLife.XCode同时还提供了一个非常宽松的方式来使用高级查询,以满足各种复杂的查询需求。 (本文同样适用于其...

    大石头
  • XCode中如何使用事务

    废话不多说,直接上代码: // try之前开始事务 Meta.BeginTrans(); try{ // do something // 强烈建议,尽可能做到只...

    大石头
  • Hibernate 脏数据检查

    脏数据检查: 什么是脏数据?脏数据并不是废弃和无用的数据,而是状态前后发生变化的数据。我们看下面的代码: 当事务提交时,Hibernate会对session中的...

    企鹅号小编
  • [NewLife.XCode]反向工程(自动建表建库大杀器)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简...

    大石头
  • [数据清洗]- Pandas 清洗“脏”数据(三)

    预览数据 这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容。具体步骤: 导入 Pandas 读取 csv 数据到 DataFra...

    数据分析
  • [数据清洗]- Pandas 清洗“脏”数据(二)

    概要 了解数据 分析数据问题 清洗数据 整合代码 了解数据 在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的。我们尝试去理解数据的列/行、记录、...

    数据分析
  • [数据清洗]-Pandas 清洗“脏”数据(一)

    概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 ...

    数据分析
  • [NewLife.XCode]数据模型文件

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。

    大石头
  • 都是脏数据惹的祸

    “还是数据问题!之前做的一个功能有一部分数据迁移工作没有做好,导致生产环境有脏数据,委托人的联系人已经不为该委托人服务了,应该移除掉的……”

    ThoughtWorks

扫码关注云+社区

领取腾讯云代金券