真实场景5:6种ID生成策略、不同场景、采用最合适策略

原创 不码不疯魔 不码不疯魔 2023-04-23 23:56 发表于四川

收录于合集

#ID生成策略1个

#Redis生成ID1个

#雪花算法生成ID1个

#百度UidGenerator算法1个

#美团Leaf算法1个

20

23

不疯魔不成活,大家好呀,我是科哥,江湖ID 不码不疯魔

真实场景:在我们的业务需求中通常有需要一些唯一的ID,来标识某条数据,譬如:用户ID、订单号、活动编号......通常我们会调研各种各样的生成策略,根据不同的业务,采取最合适的策略,那项目中生成id的方法究竟有哪些呢?【数据库自增ID】【UUID生成ID】【Redis生成ID】【雪花算法生成ID】【百度UidGenerator算法】【美团Leaf算法】

通过描述 + 优点 + 缺点 + 适用场景四个角度剖析6种ID生成策略:

      1. 数据库自增ID

      2. UUID生成ID

      3. Redis生成ID

      4. 雪花算法生成ID

      5. 百度UidGenerator算法

      6. 美团Leaf算法

重点是适用场景哟,重要事情说三遍:适用场景、适用场景、适用场景

 

方案1:数据库自增ID

描述:

自增Id是在设计表时将id字段的值设置为自增的形式,这样当插入一行数据时无
需指定id会自动根据前一字段的Id值+1进行填充

优点:

主键自动增长,不用手工设值、数字型,占用空间小、检索非常有利、有顺序,不会重复。

缺点:

并发性能不高,受限于数据库性能、不太适合重构的系统,因为涉及旧数据迁移容易Id冲突,还有
外键要考虑、新旧系统上线同时运行,数据涉及双写容易Id冲突。

适用场景:

在互联网公司,对于高并发业务,一般的表主键都是采用数据库自增,即使采用分库分表,也是
设置主键自增,原因是:一般表的主键不参与业务处理, 比较常见的设计方式是业务表加一个
业务唯一健,而且唯一健不能改变,其他业务表关联这个表的唯一键参与各种逻辑处理。例如:
券表:券Id、券号----活动表:活动Id、活动code-----活动发送记录表: 
记录Id、mobile、活动code、券号

方案2:UUID生成ID

描述:

UUID是通用唯一标识码的缩写,集群全局唯一不会重复,UUID是基于当前时间、计
数器、机器的mac地址等数据计算生成的。

优点:

本地生成没有网络IO,性能好、全局唯一不重复、使用简单不用引入中间件。

缺点:

UUID占用16个字符,空间占用较多,如果是千万级别甚至亿级别特别费空间、不
是递增的而且无序、随机写入索引性能下降。

适用场景:

对表空间没太多限制、重构类系统、UUID不作为查询字段的非高并发系统、集群
部署的中间件唯一Id。

方案3:Redis生成ID

描述:

Redis计数器,原子性自增,调用incr、incrBy方法。

优点:

并发性能高,有顺序、生成Id格式可以自定义,例如前缀+yyyyMMdd+5位自增。

缺点:

使用场景有限、因为自增,数据量容易被猜到,不安全、引入中间件、redis集群
部署需要保证高可用成本高。

适用场景:

生成Id要求自增、高性能、适合运营管理后台唯一Id生成,例如活动编号。

方案4:雪花算法生成ID

描述:

Twitter开源的分布式ID生成算法,主要是由64bit的long型生成的全局ID,引入
了时间戳和ID保持自增的属性,组成结构如下:
1bit(1:负数,0:正数)
41bit(时间戳)
5bit(表示机房Id,2^5个机房-32个机房)
5bit(表示机器Id,2^5个机器-32个机器)
12bit(序列号, 这个是用来记录同一个毫秒内产生的不同id,4096)

优点:

不依赖外部组件、性能好、按时间递增。

缺点:

机房+机器设置不合理高并发下可能会重复(应用启动机房Id、机器ID作为启动参
数传递保证唯一)、有时钟回拨的坑。
例如:729786672057983180、729786672057983181

适用场景:

互联网高并发系统

方案5:百度UidGenerator算法

描述:

UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。
UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 
从而适用于k8s环境下实例自动重启、IP漂移等场景。

优点:

在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 
采用RingBuffer来缓存已生成的Uid, 并行化Uid的生产和消费, 同时对CacheLine补齐,
避免RingBuffer带来的伪共享问题. 最终单机QPS可达600万。

缺点:

非高并发业务不适合

适用场景:

互联网高并发系统

方案6:美团Leaf算法

描述:

全局唯一,绝对不会出现重复的ID,且ID整体趋势递增。
高可用,服务完全基于分布式架构,即使MySQL宕机,也能容忍一段时间的数据库不可用。
高并发低延时,在CentOS 4C8G的虚拟机上,远程调用QPS可达5W+,TP99在1ms内。
接入简单,直接通过公司RPC服务或者HTTP调用即可接入。

优点:

支持号段模式和雪花算法:
号段模式依赖于数据库,但是区别于数据库主键自增的模式。假设100为一个号段
100,200,300,每取一次可以获得100个Id ,性能显著提高。

缺点:

非高并发业务不适合

适用场景:

互联网高并发系统

文档资料

图片

笔记文档,怎么获取?

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值