SQL Server数据库高级进阶之分布式唯一ID生成实战演练

网友投稿 1051 2023-04-07

***数据库高级进阶之分布式唯一ID生成实战演练

***数据库高级进阶之分布式唯一ID生成实战演练

一、背景需求

二、***分布式唯一ID生成实战演练

唯一ID可以标识数据的唯一性,在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种:

2.1、依赖数据库,使用SQL SERVER无序UUID和有序UUID。

1)、无序UUID:

SELECT newid() --生成36位的GUIDSELECT REPLACE(newid(), '-', '')  -- 生成32 位的GUID

2)、有序UUID:

2.2、无序随机UUID和有序UUID。

1)、无序UUID:

string guid = Guid.NewGuid().ToString();string guid = Guid.NewGuid().ToString("N");缺点:索引性能差。

2)、有序UUID:

三、.NET Core分布式唯一ID常见的几种生成方式

唯一ID划分需要根据单体应用还是分布式应用来进行区分。特别是在分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。

1、基于时间戳+随机数方式来生成唯一ID

基于时间戳:DateTime.Now.ToString("yyyyMMddHHmmssfffffff")—这种情况很容易出现重复的编号。基于时间戳+随机数:DateTime.Now.ToString("yyyyMMddHHmmssfffffff")+Random随机数。这种方式比较适合针对单体应用并发不高的业务系统,生成方式并不是严格意义上的唯一ID。

2、C#仿造Snowflake雪花算法设计

有这么一种说法,自然界中并不存在两片完全一样的雪花的。每一片雪花都拥有自己漂亮独特的形状、独一无二。雪花算法也表示生成的ID如雪花般独一无二。而twitter的snowflake解决了这种需求。snowflake是twitter开源的分布式ID生成算法,其核心思想是:一个long型的ID,使用其中41bit作为毫秒数,10bit作为机器编号,12bit作为毫秒内序列号。这个算法单机每秒内理论上最多可以生成1000*(2^12),也就是400W的ID,完全能满足业务的需求。关于雪花算法的组成部分:雪花算法会生成一个64位的二进制数据,为一个Long型。(转换成字符串后长度最多19位) ,其基本结构:

3、C#仿造mongodb的分布式主键ObjectId设计

***中_id(ObjectId)组成的12个字节按照如下方式生成

前四位是时间戳,可以提供秒级别的唯一性。接下来三位是所在主机的唯一标识符,通常是机器主机名的散列值。接下来两位是产生 ObjectId 的 PID,确保同一台机器上并发产生的 ObjectId 是唯一的。前九位保证了同一秒钟不同机器的不同进程产生的 ObjectId 时唯一的。最后三位是自增计数器,确保相同进程同一秒钟产生的 ObjectId 是唯一的。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:分布式数据库TiDB简介
下一篇:构建 MariaDB Galera Cluster 分布式数据库集群(一)
相关文章