分布式ID生成 #

为什么需要分布式ID #

全局唯一性: 不能出现重复的ID 号, 既然是唯一标识, 这是最基本的要求. 趋势递增: 在MySQL InnoDB 引擎中使用的是聚集索引, 由于多数RDBMS 使用B-tree 的数据结构来存储索引数据, 在主键的选择上面我们应该尽量使用有序的主键保证写入性能. 单调递增: 保证下一个ID 一定大于上一个ID, 例如事务版本号, IM 增量消息, 排序等特殊需求. 信息安全: 如果ID 是连续的, 恶意用户的扒取工作就非常容易做了, 直接按照顺序下载指定URL 即可; 如果是订单号就更危险了, 竞对可以直接知道我们一天的单量. 所以在一些应用场景下, 会需要ID 无规则, 不规则.

分布式ID 有哪些 #

常见的分布式ID有连续GUID、短ID、雪花算法ID。

如何使用 #

连续GUID 方式 #

静态IDGen 方式 var guid = IDGen.NextID(); // 还可以配置更多参数 var guid2 = IDGen.NextID(new SequentialGuidSettings { LittleEndianBinary16Format =true })); // Sequenti alGui dSetti ngs参数取决于你的分布式ID的实现 特别提醒 如果在循环中使用IDGen 静态类方式,性能最差,原因是底层不断解析服务。如果非循环中,性能等于下面两种用法。 IDistributedIDGenerator 注入方式推荐

private readonly IDistributedIDGenerator _idGenerator;
public AppServices(IDistributedIDGenerator idGenerator)
{
_idGenerator = idGenerator;
var guidObject = _idGenerator.Create();
}
SequentialGuidIDGenerator 方式
var idGen = new SequentialGuidIDGenerator();
var guid = idGen.Create();
// 更多参数
var idGen2 = new SequentialGuidIDGenerator();
var guid2 = idGen2.Create(new SequentialGuidSettings {
LittleEndianBinary16Format = true }));

短ID #

短ID 按道理不应该放在分布式ID 生成这个章节,它的作用用途常用于并发不强的内部系统中,比如任务ID , Issue编号等等。

var shortid = shortlDGen.NextlD(); //生成一个包含数字,字母,不包含特殊符号的8位短id
// 添加更多配置
var shortid = shortIDGen.NextID(new GenerationOptions {
UseNumbers = false, // 不包含数字
UsespecialCharacters = true, // 包含特殊符号
Length = 8,// 设置长度,注意:不设置次长度是随机长度!!!!!!!
});
// 自定义生成短ID 参与运算字符
string characters =
"㊇⑧©©e®@©©@®©⑭®_①⑪昭⑧①_②⑧_①①®①_① @@@®® ②①②③④⑤⑥⑦⑧⑨⑩⑪⑫";//whatever you want;
shortIDGen.setCharacters(characters);
//自定义随机数(for)步长
int seed = 1939048828; shortIDGen.setseed(seed);
// 重载所有自定义配置
shortIDGen.Reset();

雪花算法ID #

Mall3s采用拓展包Yitter.IdGenerator (opens new window)

上次更新: 3/10/2023, 5:33:48 PM