一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情。
雪花算法
前文
本文内容主要为对于雪花算法的一些理解及雪花算法的一个简易实现示例,可能有些描述不完全准确,主要作为一个知识总结。
什么是雪花算法
雪花算法主要是来源于twitter的一种分布式id生成算法。这个算法主要来说是解决分布式系统中id生成的重复问题。分布式系统由于每个服务往往会存在多个副本,因此当向数据库进行数据插入时,每个服务生成的主键id需要保持完全不同避免出现主键冲突。而采用java中的uuid当数量级高的时候会产生效率慢的问题,因此雪花算法便派上用场。
雪花算法主要是生成一组64位的long型ID。其中第一位表示占位符,其后41位表示时间戳,也就是用来记录生成id的时间。再之后的10位表示机器码,主要是在分布式系统的环境下,保证每次插入的id都能够唯一确定,不同机器不会在同一时刻产生相同的ID。最后的几位则用于区分同一机器同一时刻产生的时间戳,限制为同一时刻不同的随机数。通过上述内容的组合,保证分布式系统不会产生相同的主键ID,也就保证了唯一性。
实现代码
雪花算法的实现可以通过自己写代码来完成,也可以通过一些外部的工具包来实现。下面来介绍一种hutools实现雪花算法的方式。
public class SnowFlake {
public synchronized long snowflakeId(long workerId,long datacenterId){
Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);
return snowflake.nextId();
}
}
通过传入机器的id以及占位符,即可利用该工具进行雪花算法的id获取,简化了自己编写雪花算法的步骤。当然,需要记得提前进行导包操作。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.3</version>
</dependency>
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。