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

摘要:
概述本文主要介绍分布式ID生成算法中最著名的Snowflake算法。高效的数据库本身确保了主键序列的增加。很难横向扩展子数据库和子表。这很难处理。导入数据不方便。在插入数据时,INT自增主键在单机性能和严格增加主键方面具有很大的优势,但在可扩展性和分布式数据库方面,存在很大的局限性。GUID主键GUID(全局唯一标识符)根据使用以太网卡地址、纳秒时间、芯片ID代码和许多可能的数字的算法动态生成。
概述

本篇文章主要讲述分布式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中实现该算法呢?下篇博客重点揭晓。

免责声明:文章转载自《基于.NET Standard的分布式自增ID算法--Snowflake》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇几句话说清楚m.2和AHCI、NVMEAndroid学习笔记主题(Theme)资源文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mybatis批量foreach的使用

  最近在使用mybaits的过程中经常会碰到批量插入、更新的需求,经过查询资料和调试,现在总结如下(数据库mysql、oracle)   一、批量更新     1、oracle数据库 <update parameterType="list"> <foreach collection="list" item="item" index...

boot 项目启动报Cannot datermine embedded database driver class for database type NONE

部署boot项目时报Cannot datermine embedded database driver class for database type NONE数据库链接什么的也都没有问题,经过百度 因为spring boot只要你在pom中引入了mybatis-spring-boot-starter 他就会默认需要加载数据库相关的配置 你要是没有在配置文...

saas系统多租户数据隔离的实现(一)数据隔离方案

0. 前言 前几天跟朋友聚会的时候,朋友说他们公司准备自己搞一套saas系统,以实现多个第三方平台的业务接入需求。聊完以后,实在手痒难耐,于是花了两天时间自己实现了两个saas系统多租户数据隔离实现方案。俗话说“独乐乐不如众乐乐”,所以我把我的“研究成果”写出来,让大家乐呵乐呵。 在分享我的研究成果之前,我们先了解一下相关的定义吧。如果对这部分内容熟悉的同...

JForum项目搭建

JForum 是采用Java开发的功能强大且稳定的论坛系统。它提供了抽象的接口、高效的论坛引擎以及易于使用的管理界面,同时具有完全的权限控制、多语言支持(包括中文)、高性能、可自定义的用户接口、安全、支持多数据库等等特性。JForum 采用 FreeMarker 作为页面模板引擎,支持包括中文在内的二十几种语言。JForum 最大的优点是采用 BSD 开源...

相似图片搜索的三种哈希算法

想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,达到图片比较目的且利用信息指纹比较有三种算法,这些算法都很易懂,下面分别介绍一下: 一、平均哈希算法(aHash) 此算法是基于比较灰度图每个像素与平均值来实现的,最适用于缩略图,放大图搜索。 步骤: 1.缩放图片:为了保留结构去掉细节,去除大小、横纵比的差异,把图片统一...

SQL Server對象的最大容量限制

      SQL Server 数据库引擎对象 最大大小/数量 - SQL Server(32 位) 最大大小/数量 - SQL Server(64 位) 批大小1 65,536 * 网络数据包大小 65,536 * 网络数据包大小 每个短字符串列的字节数 8,000 8,000 每个 GROUP BY、ORDER BY 的字节数 8,0...