第二个:就是 雪花算法
我们在学习后台数据库id生成策略时会听到过雪花算法。
世界上不存在两片相同的雪花,得名由此而来。当然美团也有leaf算法,也是这样得来的
雪花算法是一个由Twitter开源的分布式 ID生成算法主要应用于分库分表场景中的全局ID作为业务主键,或者生成全局唯一的订单号。
我们一定见过UUID就是一种字符串型的随机id,今天就简单介绍一下它的原理部分,至于算法可以自行琢磨:
实际应用中我们需要的id长什么样子:
- 单调递增
- 安全无规则
- 记录时间戳
- 高可用性、低延迟、高QPS(QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。)
实现原理:
- 由64个Bit(比特)位组成的long类型的数字
- 用1个bit(比特)位来表示1个符号位,因为ID一般不会是负数,所以一般情况下就是0。
- 用41个bit(比特)位来表示系统时间戳,这个时间戳就是系统时间记录的毫秒数。41个bit可以表示的最大数字为2的41次方减1毫秒,换算成时间为69年。
-
用10个bit(比特)位来技术工作机器的ID,用来保证多个服务器上生成ID的唯一性。如果存在跨机房部署的情况,还可以把这10个比特位拆分为两组,每组5个bit(比特)位。前面的5个bit(比特)表示机房ID,后面5个bit(比特)表示机器ID。10个比特位最大值是2的10次方,也就是最多1024台机器。
-
用12个比特位来表示递增序列,用来记录同一毫秒内产生不同ID的能力。它的最大值为2的12次方减1,也就是4096。
-
根据这四个部分的组成规则,生成对应Bit位的数据,然后组装到一起生成一个全局唯一ID