[NewLife.XCode]增量累加

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

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。

开源地址:https://github.com/NewLifeX/X (求star, 729+)

 

回到目录

累加的需求背景

一个网站,部署了两台应用服务器,共用数据库,其中文章表有个访问次数的字段。

现在需要记录访问次数,需要怎么做?

var entity = Article.FindByID(9527);
entity.Views
++;
entity.Update();

如果两台服务器都有用户访问了9527这篇文章,访问前Views是1000,访问后是多少?1002?大部分情况下是1002,少数情况下可能是1001。

如果每台服务器都有100个用户同时访问这篇文章呢?那可就精彩了,最后访问数可能是1001到1200之间的某个数。

 

按照教科书做法,我们似乎应该开个事务加个锁,确保同时只能有一个用户(线程)修改这一行数据。

且不说加锁和事务成本有多高,光是为了一个字段就锁住这一行导致用户无法更新这一行其它字段,就让人觉得挺不地道的。再者,访问次数对于其它字段来说,也许并没有那么重要。

 

聪明如你,可以想到这么一个办法:

update article set views=views+1 where id=9527

哈,这就是XCode增量累加的出发点,每个用户(线程)执行自己的那一次,不管排队先后,最终结果都将会是1200。

 

回到目录

设置增量累加

在实体类静态构造函数中,可以设置需要增量累加的字段

640?wx_fmt=png

向 Meta.Factory.AdditionalFields 添加需要采用增量累加的字段,执行update时才生成 x=x+123 样子的语句。

测试代码:

640?wx_fmt=png

Update VisitStat Set Times=Times+123,Users=Users+1,IPs=IPs+1,UpdateTime='2019-03-26 22:36:14' Where ID=1

从输出效果看到,产生了累加效果。并且,这段代码不管执行多少次,都是这样的累加效果,而不管实际值是多少。

 

回到目录

累加原理

从数据库查出来一个对象时,如果发现有设置累加字段,XCode会把此时的数据“备份” 下来

在执行update保存的时候,拿累加字段的最后值减去原始备份值,得到差值(可能是负数),生成 x=x+123 或 x=x-456 的语句。

不光整数,小数也可以设置累加字段。

 

需要注意的是,如果字段x允许空,并且要更新行的x字段刚好为NULL,x=x+123 将会得不到预期效果。

 

回到目录

高级用法

再看开头的例子,即使使用了累加,不需要加锁以及开事务,仍然需要update数据库200次。

借助累加以及异步保存功能,可以把这个次数大大降低。 

var entity = Article.FindByID(9527);
entity.Views
++;
entity.SaveAsync(5_000);

先把Views设为累加字段。

Article.FindByID内部可以用对象缓存,然后每台应用服务器在10秒(默认缓存时间)内多线程查到的都是同一个entity对象。

SaveAsync将把对象entity放入实体队列,5秒后延迟保存。如果200用户访问集中在5秒内,最后每台服务器只会执行一次update操作。

Update Article Set Viewss=Views+100 Where ID=9527

数据库写入次数由200次下降到2次,提升100倍。

 

由此,你能想到什么更有意思的用法了吗?

 

回到目录

系列教程

NewLife.XCode教程系列[2019版]

  1. 增删改查入门。快速展现用法,代码配置连接字符串

  2. 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)

  3. 实体类详解。数据类业务类,泛型基类,接口

  4. 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置

  5. 反向工程。自动建立数据库数据表

  6. 数据初始化。InitData写入初始化数据

  7. 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)

  8. 脏数据。如何产生,怎么利用

  9. 增量累加。高并发统计

  10. 事务处理。单表和多表,不同连接,多种写法

  11. 扩展属性。多表关联,Map映射

  12. 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计

  13. 数据层缓存。Sql缓存,更新机制

  14. 实体缓存。全表整理缓存,更新机制

  15. 对象缓存。字典缓存,适用用户等数据较多场景。

  16. 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存

  17. 实体工厂。元数据,通用处理程序

  18. 角色权限。Membership

  19. 导入导出。Xml,Json,二进制,网络或文件

  20. 分表分库。常见拆分逻辑

  21. 高级统计。聚合统计,分组统计

  22. 批量写入。批量插入,批量Upsert,异步保存

  23. 实体队列。写入级缓存,提升性能。

  24. 备份同步。备份数据,恢复数据,同步数据

  25. 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版

  26. 大数据分析。ETL抽取,调度计算处理,结果持久化

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

King of Range

King of Range 题意: 给你n个数,有m个询问,每次询问一个x,问有多少个区间的最大值减最小值大于x 题解: 我一开始的想法 st表实现区间最大减最小,利用二分来找这个区间范围,复杂度O(nmlogn)&…

膜拜大丹(结论+二元环)

problem 有两个国家,国家 AAA 有 nnn 座城市,国家 BBB 有 mmm 座城市,两个国家间有若干条单向航线。 具体地,有长度为 nnn 的数组 aaa 和长度为 mmm 的数组 bbb。国家 AAA 的第 iii 座城市有单向航线可以到达国家 BBB 的 1∼ai1…

Jewels

Jewels 题意: 你的坐标是(0,0,0),有m个宝物,分别坐标是是(xi,yi,zi),它的z坐标以每秒下沉vi深度,你每次获取一个宝物的费用是两者的距离的平方,每秒只能获取一个宝物,从第0秒开始,问获取所有宝…

[NewLife.XCode]脏数据

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中&#xff0…

[学习笔记] 二分图基础定理的相关证明

最小点集覆盖最大匹配 最小点集覆盖:选出最少的点使得每条边都至少有一个端点被选。 先证最小点集覆盖 ≥\ge≥ 最大匹配 假设最大匹配为 xxx,即有 xxx 条边两两之间没有公用点。 光覆盖这些边就要用到 xxx 个点。 “不少于”已证。 再证最小点集覆盖 …

Boxes

Boxes 题意: 有n个盒子,每个盒子里要么是黑球,要么是白球,你可以花C的代码得知剩下所有盒子中黑球数量和白球数量,(只是知道总数量,并不知道具体哪个盒子里是什么),你可以可以花费wi的代价开第…

Double Strings

Double Strings 题意: 给你s和t两个字符串,在其中选出两个等长的子序列(可以不连续)a,b,满足a的字典序严格小于b的字典序,问方案数,答案mod(1e97) 题解: 好的方案的构成是一段相同的前缀一个不同的字符…

你真的了解用户吗?-浅谈《用户画像》的意义和方法

作者:陈炯关于作者系统集成项目管理高级工程师某大型国有银行高级质量管理师从事IT项目管理工作十余年具有丰富的开发与管理经验公司内部敏捷转型的发起者之一深度参与敏捷实践与总结大学校园里流传最广的一句话是什么?“防火防狼防师兄”。为什么师兄这…

[学习笔记] 二次剩余

二次剩余 对于素数 ppp 和数 aaa,满足 (a,p)1(a,p)1(a,p)1。(注意 aaa 不一定小于 ppp) 若 ∃xx2≡a(modp)\exist_{x}\ x^2\equiv a\pmod p∃x​ x2≡a(modp),则称 aaa 是模 ppp 意义下的二次剩余,xxx 称为该二次剩余…

Script Lab 续:为 Officejs 开发配置 VSCode 环境

垫场AA:深度:从 Office 365 新图标来看微软背后的设计新理念--------------------------------------------------前期01:尝试:Script Lab,快速 Office 365 开发工具前期02:尝试:Script Lab&…

P3567 [POI2014]KUR-Couriers

P3567 [POI2014]KUR-Couriers 题意: 给一个长度为 n 的正整数序列 a。共有 m 组询问,每次询问一个区间 [l,r] ,是否存在一个数在 [l,r]中出现的次数严格大于一半。如果存在,输出这个数,否则输出 0。 题解&#xff1…

[WC 2022 Day3 zmy] Od deski do deski(dp)

设 fi:1∼if_{i}:1\sim ifi​:1∼i 能否分成若干个首尾相同的区间 则有 fiORj<i(fj−1∧ajai)f_{i}\text{OR}_{j<i}(f_{j-1}\wedge a_ja_i)fi​ORj<i​(fj−1​∧aj​ai​)。 这是最原始的暴力 dpdpdp&#xff0c;时间 O(n2m)O(n^2m)O(n2m)。 事实上&#xff0c;这…

编程方式重启 ASP.NET Core 网站

点击上方蓝字关注“汪宇杰博客”常言道&#xff0c;多喝热水&#xff0c;重启试试。有时候当应用工作不正常&#xff0c;重启也许能解决问题。但是程序员通常接触不到服务器系统权限。而运维人员和公司流程经常人为制造麻烦阻止我们去重启应用。老实的程序员不善言辞交际&#…

可持久化3--可持久化01Trie

01Trie 可持久化 01Trie 的方式和可持久化值域线段树的方式是相似的&#xff0c;只是以 01字典树 的方式来维护值域。一般用来解决异或相关的能够按位贪心的题目。 其实就是将可持久化线段树中的操作嫁接到01Trie中&#xff0c;这样就是解决任意一个区间内的问题。 例题&…

AGC044E Pandom Pawn(期望+凸包)

最开始我们先旋转一下这张桌子&#xff0c;使得 A1An1max⁡{Ai}A_1A_{n1}\max\{A_i\}A1​An1​max{Ai​}。 这是非常有效的&#xff0c;因为我们把环就变成链&#xff0c;只要到达了链的任意一端 1/n11/n11/n1 就肯定会结束游戏。 定义 Ei:E_i:Ei​: 从 iii 开始游戏&#xf…

.NET Core 容器化调查

前几天在微信朋友圈做了一个简单的调查&#xff0c;参与人数有500人&#xff0c;调查结果如下&#xff1a;使用K8S的比例非常类似于2017年初我在公众号里针对.NET Core的使用情况的比例。.NET Core是针对云原生应用开发而重新设计的一个平台&#xff0c;.NET Core借鉴了.NET Fr…

P4735 最大异或和

P4735 最大异或和 题意&#xff1a; 一个非负序列a&#xff0c;初始长度为n&#xff0c;有两种操作&#xff1a; A x&#xff0c;在序列中添加x&#xff0c;n加一Q l r x,询问操作&#xff0c;询问一个位置p&#xff0c;p满足l<p<r,使得p到位置n的的异或和与x的异或值…

[学习笔记] 单位根反演

单位根反演 [k∣n]1k∑i0k−1ωkin[k\mid n]\frac 1k\sum_{i0}^{k-1}\omega_k^{in}[k∣n]k1​∑i0k−1​ωkin​ kkk 次单位根是 kkk 次幂为 111 的复数解 wkw_kwk​。利用单位圆和单位根的关系很容易证明。 k∣nk\mid nk∣n 显然 ωkin\omega_k^{in}ωkin​&#xff0c;相当于…

NET Core微服务之路:再谈分布式系统中一致性问题分析

前言一致性&#xff1a;很多时候表现在IT系统中&#xff0c;通常在分布式系统中&#xff0c;必须&#xff08;或最终&#xff09;为多个节点的数据保持一致。世间万物&#xff0c;也有存在相同的特征或相似&#xff0c;比如儿时的双胞胎&#xff0c;一批工厂流水线的产品&#…

P4592 [TJOI2018]异或

P4592 [TJOI2018]异或 题意&#xff1a; 现在有一颗以 1 为根节点的由 n 个节点组成的树&#xff0c;节点从 1 至 n 编号。树上每个节点上都有一个权值 vi。现在有 q 次操作&#xff0c;操作如下&#xff1a; 1 x z&#xff1a;查询节点 x 的子树中的节点权值与 z 异或结果的…