微服务/分布式架构下,ID生成该如何选择

目录

方案一:数据库自增

方案二:UUID

方案三:全局Redis

方案四:雪花算法

总结


方案一:数据库自增

数据库自增可以确保 ID 唯一,但会存在一定的问题。如多表合并成一张表,会出现 ID 冲突的情况。如下图:

方案二:UUID

UUID 确实可以作为主键生成的一种策略,但是大家都清楚,UUID 长度是128 bit ,是由128位二进制数据转换而来,其中有四个固定的 “-” 进行分割,每四个二进制转换为一个十六进制,128/4=32,UUID 最终的组成是由32个十六进制数组成。其缺点一目了然,It's too long。

方案三:全局Redis

我们可以通过 Redis 的计数器实现 ID 的自增唯一,每次从 Redis 取出值作为主键,但是会消耗很多网络资源。

方案四:雪花算法

采用 twitter 开源的的 snowflake 算法实现 ID 生成,结构如下图:

1bit-不用:因为二进制中最高位是符号位,1表示负数,0表示正数。生成的 ID 一般都是用整数,所以最高位固定为0。

41bit-时间戳:用来记录毫秒级的时间戳。

10bit-工作机器ID:用来记录工作机器 ID。

12bit-序列号:用来记录同毫秒内产生的不同 ID。

  • 优势
    • 生成有序的 Long 形数据
    • 生成的数据按照时间趋势递增
    • 由于有 datacenterId 和 workerId 来做区分,所以整个系统内不会产生重复 ID
  • 劣势
    • 需要独立部署 ID 生成器,增加维护成本

总结

上述四种方案均可实现 ID 生成策略,各位按需采纳,根据实际业务场景进行选型。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫咪老师QAQ

赏一点猫粮叭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值