概述
本篇文章主要讲述分布式 ID 生成算法中最出名的 Snowflake 算法. 搞. NET 开发的, 数据库主键最常见的就是 int 类型的自增主键和 GUID 类型的 uniqueidentifier.
那么为何还要引入 snowflake 呢?
INT 自增主键
自增主键是解决主键生成的最简单方案, 它有如下优势:
数据库本身负责主键生成, 效率高
数据库本身保证主键顺序递增, 方便存储和检索
相对应的, 它也有如下缺点:
严重依赖数据库服务
强顺序递增, 不易横向扩展
分库分表很难处理
不方便导入数据
上层应用在插入数据时, 如果需要获知主键, 必须再次查询
总结来说, INT 自增主键在单机性能和主键严格递增上由很大的优势, 但是在扩展性和分布式数据库上有较大限制
GUID 主键
GUID(全局唯一标识符, Globally Unique Identifier) 为 128 位 (16 字节), 它使用太网卡地址, 纳秒级时间, 芯片 ID 码和许多可能的数字根据算法动态生成, 理论上可以有 2^128 个结果,
所以产生 2 个相同的 ID 的几率非常小.
它的优点如下:
应用生成, 解放服务器压力
生成的 ID 可以做到全库唯一, 方便数据库分库分表, 数据导入
缺点也很明显:
16 字节太长, 浪费空间
非顺序递增, 增加数据库存储和检索开销
在做数据库主键选则时, 如果系统较小, 业务逻辑相对简单, 可以考虑使用自增主键; 如果业务复杂, 涉及到分库分表分布式等, 建议考虑 GUID. 如果认为 GUID 的缺点太影响使用,
可以考虑马上开始重点介绍的分布式 ID 生成算法 Snowflake
Snowflake 是由 Twitter 提出并首先使用的分布式 ID 生成算法, 使用它来生成分布式趋势递增的 Id.
分布式
Id 有分布式系统的节点自己生成
趋势递增
主键非严格顺序递增的, 而是根数时间顺序递增, 这在一定程度上保证了数据存储和索引的效率
算法讲解
总长度为 64 位长整型 (8 字节)
1 位: 首字节固定为 0, 来保证所有生成的数据都是正数
41 位: 第 2 到第 42 位工 41 字节, 用于生成毫秒级时间戳, 计算大概 (2^41−1)/(1000606024365)=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.
它的优点如下:
应用生成, 解放服务器压力
生成的 ID 可以做到全库唯一, 方便数据库分库分表, 数据导入
8 字节, 长整型, 节省空间
趋势递增, 方便数据存储和查询
如何在. NET 中实现该算法呢? 下篇博客重点揭晓.
来源: https://www.cnblogs.com/leafly/p/10080774.html