基于.NET Standard的分布式自增ID算法--Snowflake

概述

本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法。搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier。
那么为何还要引入snowflake呢?

INT自增主键

自增主键是解决主键生成的最简单方案,它有如下优势:

  1. 数据库本身负责主键生成,效率高

  2. 数据库本身保证主键顺序递增,方便存储和检索

相对应的,它也有如下缺点:

  1. 严重依赖数据库服务

  2. 强顺序递增,不易横向扩展

  3. 分库分表很难处理

  4. 不方便导入数据

  5. 上层应用在插入数据时,如果需要获知主键,必须再次查询

总结来说,INT自增主键在单机性能和主键严格递增上由很大的优势,但是在扩展性和分布式数据库上有较大限制

GUID主键

GUID(全局唯一标识符,Globally Unique Identifier)为128位(16字节),它使用太网卡地址、纳秒级时间、芯片ID码和许多可能的数字根据算法动态生成,理论上可以有2^128个结果,
所以产生2个相同的ID的几率非常小。

它的优点如下:

  1. 应用生成,解放服务器压力

  2. 生成的ID可以做到全库唯一,方便数据库分库分表、数据导入

缺点也很明显:

  1. 16字节太长,浪费空间

  2. 非顺序递增,增加数据库存储和检索开销

在做数据库主键选则时,如果系统较小,业务逻辑相对简单,可以考虑使用自增主键;如果业务复杂,涉及到分库分表分布式等,建议考虑GUID。如果认为GUID的缺点太影响使用,
可以考虑马上开始重点介绍的分布式ID生成算法 Snowflake

Snowflake是由Twitter提出并首先使用的分布式ID生成算法,使用它来生成分布式趋势递增的Id。

  1. 分布式
    Id有分布式系统的节点自己生成

  2. 趋势递增
    主键非严格顺序递增的,而是根数时间顺序递增,这在一定程度上保证了数据存储和索引的效率

算法讲解

总长度为64位长整型(8字节)

1位:首字节固定为0,来保证所有生成的数据都是正数

41位:第2到第42位工41字节,用于生成毫秒级时间戳,计算大概(2^41−1)/(1000∗60∗60∗24∗365)=69 年,对于一般系统来说绝对够用。

10位: 第43位到第52位为工作机ID,可表示2^10=1024台设备,一般高5位表示机房Id(datacenterId),低5位表示工作节点ID(workid)

12位:第53位到第64位表示序列号,2^12-1=4095

综上算法,表示单机每毫秒可以提供4095个Id,所有机器每毫秒可生成4095*1024=4194304个Id。

它的优点如下:

  1. 应用生成,解放服务器压力

  2. 生成的ID可以做到全库唯一,方便数据库分库分表、数据导入

  3. 8字节,长整型,节省空间

  4. 趋势递增,方便数据存储和查询

如何在.NET中实现该算法呢?下篇博客重点揭晓。

原文地址:https://www.cnblogs.com/leafly/p/10080774.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg

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

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

相关文章

2021“MINIEYE杯”中国大学生算法设计超级联赛(4)Display Substring(后缀数组+二分)

Display Substring #include<bits/stdc.h> using namespace std; typedef long long ll; // sa[i]: 排名是i位的是第几个后缀 // rk[i]: 第i个后缀的排名是多少 // height[i]: sa[i]与sa[i-1] const int N100010; char s[N]; int rk[N],sa[N],cnt[N],height[N]; int x[N]…

领域驱动设计,让程序员心中有码(二)

引子&#xff0c;软件工程没有银弹上一篇博文领域驱动设计&#xff0c;让程序员心中有码&#xff0c;抛出了一个问题&#xff0c;领域驱动设计真的是万能的良方吗&#xff1f;对于这个问题&#xff0c;大家的答案无疑是一致的&#xff0c;作为一种非常受软件行业欢迎的软件思想…

邮局-[IOI2000](四边形不等式)

概要 四边形不等式的核心在于缩小最优转移的范围 题目描述 传送门 解析 这道题说是不等式&#xff0c;但其实也可以感性理解 &#xff08;其实就是不想证明&#xff09; 定义pl[i][k]: i到n的村庄建造k座邮局时&#xff0c;第一座管辖的范围是i-pl[i][k] (也就是最优决策…

.NET Core实战项目之CMS 第九章 设计篇-白话架构设计

前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计&#xff0c;源码也已经上传到服务器上了。今天我们就好聊聊架构设计&#xff0c;在开始之前先给大家分享一下这几天我一直在听的《从零开始学架构》里面关于架构设计的定义以及架构设计的三大原则&#xff0c;希望能对大…

今日头条Marketing API小工具(.Net Core版本)

前言由于工作原因&#xff0c;需要用到今日头条的Marketing API做一些广告投放的定制化开发。然后看现在网上也没多少关于头条Marketing API的文章&#xff0c;于是便就有了该篇文章。头条Marketing API主页地址&#xff1a;https://ad.toutiao.com/openapi/index.html。头条Ma…

.NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计

这两天比较忙&#xff0c;周末也在加班&#xff0c;所以更新的就慢了一点&#xff0c;不过没关系&#xff0c;今天我们就进行千呼万唤的系统开发框架的设计。不知道上篇关于架构设计的文章大家有没有阅读&#xff0c;如果阅读后相信一定对架构设计有了更近一部的理解&#xff0…

分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0

今年五月的 Build 大会上&#xff0c;微软说 .NET Core 3.0 将带来 WPF / Windows Forms 这些桌面应用的支持。当然&#xff0c;是通过 Windows 兼容包&#xff08;Windows Compatibility Pack&#xff09;实现的。为了提前检查你的程序是否能在未来跑在 .NET Core 3.0 上&…

ML.NET 0.8特性简介

本周.NET生态圈内的更新源源不断&#xff0c;除了.NET Core 2.2&#xff0c;ASP.NET Core 2.2和Entity Framework Core 2.2之外&#xff0c;ML.NET 0.8也一并登上舞台。新的推荐场景ML.NET使用基于矩阵分解(Matrix Factorization)和场感知分解机(Field-aware Factorization Mac…

F-Lucky Pascal Triangle(Lucas+数位dp)

F-Lucky Pascal Triangle issue是fw题解 下面代码TLE了&#xff0c;但是此题数位dp的思想非常值得学习 Lucas的过程相当于把n,mn,mn,m在p进制下的每一位拿出来做组合数 Lucas(n,m,p)∏(nkmk)modp\text{Lucas}(n,m,p)\prod \dbinom {n_k}{m_k} \bmod pLucas(n,m,p)∏(mk​nk​…

树的合并(ybtoj-树上dp)

文章目录题目描述前言解析代码thanks for reading&#xff01;题目描述 前言 全网唯一AC&#xff01;&#xff01;&#xff01; 妙啊 而且还是完全自己想出来的做法 开心 &#xff08;APIO还是没白听&#xff09; 但是思路出来后代码实现十分坎坷 建两个图分别dfs3次那个地方…

.net core中的高效动态内存管理方案

.net core在新增的System.Buffers中引入了一大堆高效内存管理的类&#xff0c;如span和memory、内存池。本文今天这里介绍一个高效动态内存访问方案。ReadOnlySequenceSegment<T>在我们读取数据的过程&#xff0c;很多时候会出现如下场景&#xff1a;不知道数据实际大小一…

.net core 上 K8S(三)Yaml文件运行.netcore程序

正文上一章我们通过kubectl run简单运行了一个.netcore网站&#xff0c;但实际的开发中&#xff0c;我们都是通过yaml来实现的。1.编写yaml文件关于yaml文件的格式在此就不多描述了&#xff0c;不熟悉的可以去网上搜一下示例。2.运行yamlkubectl create -f netcore.yaml 我们可…

Jozky模板

文章目录字符串处理后缀数组manacherhashKMP最大最小表达法数论约瑟夫环欧拉函数莫比乌斯反演逆序对归并排序求逆序对素数线性筛欧几里得与扩展欧几里得欧几里得算法&#xff1a;扩展欧几里得算法&#xff1a;逆元扩展欧几里得费马小定理欧拉定理递推求逆元__int128高精度运算唯…

Visual Studio 2017 15.9 版本发布:推出全新的导入 / 导出配置功能

Microsoft 在开发 Visual Studio 2019 的同时&#xff0c;还在继续支持 VS2017 的用户。公司已经发布了 9 次更新&#xff0c;这展示了 Microsoft 在常规更新发布之后仍然会坚守继续支持 Visual Studio 的承诺。我们已经介绍过 15.9 版本中的一些新增内容&#xff0c;但是在最终…

染色(树链剖分 洛谷-P2486)

文章目录题目描述解析代码thanks for reading&#xff01;传送门首先&#xff0c;对hash学姐对本题拔刀相助的debug行为表示衷心的感谢 题目描述 解析 用线段树维护颜色序列个数、最左颜色与最右颜色 合并时如果左儿子的最右颜色等于右儿子的最左颜色&#xff0c;就把加和-1 在…

C# 8中的范围类型(Range Type)

C# 8.0中加入了一个新的范围类型(Range Type)。这里我们首先展示一些代码&#xff0c;并一步一步为代码添加一些不同的东西, 为大家展示一下范围类型的功能和用法。我们最原始的代码如下&#xff1a;这里我们显示的定义了我们查询数组的索引1-3, 并输出他们的值。毫无疑问&…

选数游戏(ybtoj-二叉堆)

文章目录题目描述解析代码thanks for reading&#xff01;题目描述 解析 一道很考验代码能力与思维的题 &#xff08;我不是在为自己的菜找理由&#xff09; 首先由于可以每一列都有类似于环的性质 所以我们可以忽略点的出入的纵坐标的位置&#xff0c;只考虑每列选几个 首先&…

CF741C Arpa’s overnight party and Mehrdad’s si

题目描述&#xff1a; 有n对情侣&#xff08;2n个人&#xff09;围成一圈坐在桌子边上&#xff0c;每个人占据一个位子&#xff0c;要求情侣不能吃同一 种食物&#xff0c;并且桌子上相邻的三个人的食物必须有两个人是不同的&#xff0c;只有两种食物&#xff08;1或者是2&…

开源库支付库Magicodes.Pay发布

Magicodes.Pay&#xff0c;是心莱科技团队提供的统一支付库&#xff0c;相关库均使用.NET标准库编写&#xff0c;支持.NET Framework以及.NET Core。目前支持以下支付方式和功能&#xff1a;支付宝APP支付支付宝Wap支付支付宝国际支付 支持分账微信小程序支付微信APP支付统一支…

火车载客(ybtoj-二叉堆)

文章目录题目描述解析我的思路代码题解思路题目描述 解析 我的思路 其实就是线段覆盖的一个变体 贪心的想&#xff1a; 把游客按右端点升序排序 后面的证明就和线段覆盖一样了 如果有两个游客冲突 我们应该选右端点靠右的 因为这样对以后继续在右边出现的游客来说肯定不会更差…