实用c代码(开源之分布式主键ID生成器IdGenerator)

描述

迄今为止最全面的分布式主键ID生成器,其具有以下这些特点

  • 这是优化的雪花算法(雪花漂移),它生成的ID更短、速度更快
  • 支持 k8s 等容器环境自动扩容(自动注册 WorkerId),可在单机或分布式环境生成数字型唯一ID。
  • 支持多语言,原生支持 C#/Java/Go/Rust/C/SQL/Node.js/PHP(C扩展) 等语言,并提供Python、PB多线程安全调用动态库(FFI)。
  • 兼容所有雪花算法(号段模式或经典模式,大厂或小厂),将来你可以做任意的升级切换。(一般无须升级,但理论上支持)
  • 整形数字,随时间单调递增(不一定连续),长度更短,用50年都不会超过 js Number类型最大值。(默认配置)
  • 速度更快,是传统雪花算法的2-5倍,0.1秒可生成50万个(基于8代低压i7)。
  • 支持时间回拨处理。比如服务器时间回拨1秒,本算法能自动适应生成临界时间的唯一ID。
  • 支持手工插入新ID。当业务需要在历史时间生成新ID时,用本算法的预留位能生成5000个每秒。
  • 基础功能,开箱即用,无需配置文件、数据库连接等。
参数

来源:GitHub(668) https://github.com/yitter/IdGenerator

协议:MIT

示例

首先到nuget上安装Yitter.IdGenerator最新的包。

// 创建 IdGeneratorOptions 对象,请在构造函数中输入 WorkerId: var options = new IdGeneratorOptions(1); // options.WorkerIdBitLength = 10; // WorkerIdBitLength 默认值6,支持的 WorkerId 最大值为2^6-1,若 WorkerId 超过64,可设置更大的 WorkerIdBitLength // ...... 其它参数设置参考 IdGeneratorOptions 定义,一般来说,只要再设置 WorkerIdBitLength (决定 WorkerId 的最大值)。 // 保存参数(必须的操作,否则以上设置都不能生效): YitIdHelper.SetIdGenerator(options); // 以上初始化过程只需全局一次,且必须在第2步之前设置。

// 初始化以后,即可在任何需要生成ID的地方,调用以下方法: var newId = YitIdHelper.NextId();

如果基于DI框架集成,可以参考 YitIdHelper 去管理 IdGenerator 对象,必须使用单例模式。

个人特地安装了IdGenerator包,运行20次生成了如下20条ID主键,性能和长度都能接受。

实用c代码(开源之分布式主键ID生成器IdGenerator)(1)

性能

10位自增序列,1000次漂移最大值

连续请求量

5K

5W

50W

传统雪花算法

0.0045s

0.053s

0.556s

雪花漂移算法

0.0015s

0.012s

0.113s

极致性能:500W/s~3000W/s。(所有测试数据均基于8代低压i7计算)

129053495681099 (运行1年) 387750301904971 (运行3年) 646093214093387 (运行5年) 1292658282840139 (运行10年) 9007199254740992 (js Number 最大值,可以支撑70年) 165399880288699493 (普通雪花算法生成的ID)

结尾

目前唯一ID的实现方式非常多,该开源包作为雪花算法的升级版,其长度压缩,性能提升,实现方式非常简单,是个不错的开源源码,并且其几乎支持市面上主流开发语言。C#语言下的代码粗略的浏览过,代码量不多,总共就几个类,而且其是MIT协议的,甚至可以直接将其几个类文件直接整合到项目之中。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页