生成分布式唯一ID的方式有很多种如常见的有UUID、Snowflake(雪花算法)、数据库自增ID、Redis等等,今天我们来讲讲.NET集成IdGenerator生成分布式全局唯一ID。
分布式ID是一种在分布式系统中生成唯一标识符的方法,用于解决多个节点之间标识符重复或性能问题。
IdGenerator是一个全面的分布式主键ID生成器,使用的是优化的雪花算法(SnowFlake)雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。
(参数:10位自增序列,1000次漂移最大值).
连续请求量 | 5K | 5W | 50W |
---|---|---|---|
传统雪花算法 | 0.0045s | 0.053s | 0.556s |
雪花漂移算法 | 0.0015s | 0.012s | 0.113s |
💍 极致性能:500W/s~3000W/s。(所有测试数据均基于8代低压i7计算)
搜索NuGet包:Yitter.IdGenerator。
using Yitter.IdGenerator; namespace IdGeneratorTest { internal class Program { static void Main(string[] args) { #region 第一步:全局初始化(应用程序启动时执行一次) // 创建 IdGeneratorOptions 对象,可在构造函数中输入 WorkerId: // options.WorkerIdBitLength = 10; // 默认值6,限定 WorkerId 最大值为2^6-1,即默认最多支持64个节点。 // options.SeqBitLength = 6; // 默认值6,限制每毫秒生成的ID个数。若生成速度超过5万个/秒,建议加大 SeqBitLength 到 10。 // options.BaseTime = Your_Base_Time; // 如果要兼容老系统的雪花算法,此处应设置为老系统的BaseTime。 // WorkerId:WorkerId,机器码,最重要参数,无默认值,必须 全局唯一(或相同 DataCenterId 内唯一),必须 程序设定,缺省条件(WorkerIdBitLength取默认值)时最大值63,理论最大值 2^WorkerIdBitLength-1(不同实现语言可能会限定在 65535 或 32767,原理同 WorkerIdBitLength 规则)。不同机器或不同应用实例 不能相同,你可通过应用程序配置该值,也可通过调用外部服务获取值。 // ...... 其它参数参考 IdGeneratorOptions 定义。 var idGeneratorOptions = new IdGeneratorOptions(1) { WorkerIdBitLength = 6 }; // 保存参数(务必调用,否则参数设置不生效): YitIdHelper.SetIdGenerator(idGeneratorOptions); // 以上过程只需全局一次,且应在生成ID之前完成。 #endregion #region 第二步:生成分布式ID for (int i = 0; i < 1000; i++) { // 初始化后,在任何需要生成ID的地方,调用以下方法: var newId = YitIdHelper.NextId(); Console.WriteLine($"Number{i},{newId}"); } #endregion } } }
更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。
https://github.com/yitter/IdGenerator
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞
)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
欢迎加入DotNetGuide技术社区微信交流群👪