思路参照ObjectId:https://www.runoob.com/mongodb/mongodb-objectid.html
但是MongoDB已经修改了ObjectId生成逻辑,其中机器码和进程ID改为随机数,因为两者在不同机器上的重复概率很高。
我在其基础上进行了精简和修改:
前5位表示当前时间戳,最多支持3万多年的秒级计数,从公元0年开始计数。
后3位为递增数,每秒最多支持16777215个ID生成,已达到性能瓶颈。
如果后期需要对系统进行分布式改造,那么将后3位的递增数进行拆分。
在初始化时,给每台服务器分发不同的的递增ID范围,这样可确保生成ID非重复。
当然所有递增ID加起来肯定也不能超过16777215这个极限,每秒生成这么多内容够用了。
最后将这个ID封装成恰好8位的BigInt类型,然后存储进KV(大部分Key支持Int64)。
class Aid {
private static _ = 0;
static bin(): string {
if (this._ >= 10000000) { this._ = 0; }
this._++;
return (Math.round(Date.now() / 1000) + 62167219200).toString(2).padStart(40, '0') + this._.toString(2).padStart(24, '0');
}
static big(): bigint {
return BigInt('0b' + this.bin());
}
}