[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='', 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]脏数据的更多相关文章
- [NewLife.XCode]数据初始化
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
- [NewLife.XCode]数据层缓存(网站性能翻10倍)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- [NewLife.XCode]分表分库(百亿级大数据存储)
NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量 ...
- 【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www ...
- [NewLife.XCode]对象字典缓存(百万军中取敌首级)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- [NewLife.XCode]高级增删改
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
- [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- [NewLife.XCode]增删改查入门
NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...
- [NewLife.XCode]数据模型文件
NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...
随机推荐
- NOIP刷题建议(未完结)
1NOIP提高组真题 2NOI部分题目 为什么要写这个? 主要是一个人在硕大的机房里打(wan)代(you)码(xi),没多少时间了,所以打算来总结一下. 这个也是为我接下来冲刺做一个准备. 这个会不 ...
- win 10 的wordcloud的安装
这两天为了安装wordcloud库可谓是“一把辛酸”,各种出错 jieba什么就不说了,安装和使用都很简单只需要一句代码就可以实现了,而wordcloud在安装之前,本以为也像jieba那样的简单,但 ...
- IPC rtsp转发服务器搭建
sudo apt-get install libmoose-perl liburi-perl libmoosex-getopt-perl libsocket6-perl libanyevent-per ...
- Unity3D中AssetBundle应用
工程中的模型等资源转化为Prefab后,打包成AssetBundle,可以大幅降低资源的空间占有度,并且提高资源加载的效率. 一.AssetBundle的打包 先看下打包Prefab的脚本代码,这段脚 ...
- 卸载HDP大数据平台
使用以下说明卸载HDP: 停止所有已安装的HDP服务.请参阅HDP参考指南中的停止HDP服务. 如果安装了Knox,请在所有群集节点上运行以下命令: 对于RHEL / CentOS / Oracle ...
- weblogic获取应用目录路径(war包)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...
- window系统中 mongodb创建用户名和密码
use admindb.createUser({user:"root",pwd:"root",roles:[{"role":"us ...
- IDEA的Database管理台如何显示
1.找出database的显示view 2.点击设置数据库,下载驱动文件,直接点击下载就行了,用什么数据库就下什么 3.填写服务器地址和用户名密码,点击测试,成功就表示连上了 4.一些常用按钮 5.目 ...
- 蓝桥杯_算法训练_ALGO10_集合运算
这个题实际上思路是比较简单的,但是需要注意细节问题. 思路:读入数组之后进行排序,然后再求交.并.补集. 首先排序:(使用的是冒泡排序) #include<iostream> using ...
- uintAPi 之Renderer.material
Renderer.material public Material material; Returns the first instantiated Material assigned to the ...