分布式主键id生成方式之雪花算法

>> 饿了么、美团外卖红包领取地址<<

在分布式环境下,通常都会有主键id或者单号创建的需求。要求在任何情况下生成的主键id或者单号都是不能够重复的,所以我们需要一种主键或者单号生成机制。这里有一下几种方法:

1、数据库自增
使用mysql数据库的主键id自增

2、redis自增
使用redis的INCR命令实现id自增,INCR命令相关知识参考:http://doc.redisfans.com/string/incr.html

3、使用uuid
uuid的生成规则详见:https://baike.baidu.com/item/UUID/5921266?fr=aladdin

4、雪花算法
雪花算法(SnowFlake),是Twitter开源的分布式id生成算法。其核心思想就是:使用时间戳+工作机器id+序列号生成一个64 bit的long型的数字作为全局唯一id。具体的结构见下图(详细的说明可以百度)

SnowFlake可以保证:
(1)所有生成的id按时间趋势递增
(2)整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)

在java中如何使用雪花算法?这里我们可以不用自己去编写,因为有很多工具都帮我们做好了,我这里使用hutool进行使用的一个演示
在pom中引入hutool的工具包(注:版本需要4.5.9以上)

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.5.9</version>
</dependency>

使用示例代码(主要使用的是IdUtil,顺便吧uuid也编写了)

//生成带-的UUID字符串
System.out.println(IdUtil.randomUUID());

//生成不带-的UUID字符串
System.out.println(IdUtil.simpleUUID());

//使用雪花算法生成id
System.out.println(IdUtil.getSnowflake(0,0).nextId());

//使用雪花算法生成id,返回字符串类型
System.out.println(IdUtil.getSnowflake(1,1).nextIdStr());
System.out.println(IdUtil.getSnowflake(1,1).nextIdStr());
System.out.println(IdUtil.getSnowflake(2,1).nextIdStr());
System.out.println(IdUtil.getSnowflake(2,1).nextIdStr());

结果:


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍

成人本科学士学位英语统一考试星级词汇大冲关(第2版 乱序版)
¥18.09
长城【勇系列】金吉星合成技术机油 SP/GF-6A 5W-30 发动机油850g/1L
¥32.90
励展(LIZHAN)医用外科口罩一次性成人防护三层医疗正品透气轻薄防尘50只/盒 蓝色非独立
¥19.80
银华棠医用壳聚糖痔疮洗液痔疮膏孕妇肛门肉球瘙痒内外混合治痔除疮软膏的药肛裂便秘便血男女创面愈合凝胶
¥29.00
修正腰椎间盘突出膏贴护腰椎突出症远红外磁疗筋骨贴骨质增生骨刺贴腰痛贴腰部酸疼痛腰间盘突出专用贴
¥35.00
ESCASE 工兵铲铁锹可折叠车载户外挖土地铲镐锹钓鱼小铲子随车赶海工具
¥47.00
sharemood衣柜衣橱蜡片香片香包香皂礼盒香氛香薰挂件室内洗手间除臭
¥40.30
五虎爪 婴儿口罩10枚3d立体婴童口罩宝宝一次性口罩新生幼儿透气防护专用0-6月到1岁半 款式随机 白色
¥26.80