全局唯一ID的生成及还原

本文介绍了多种分布式环境下全局唯一ID的生成方法,包括数据库自增主键、UUID、时间戳、Zookeeper和Snowflake算法,分析了各自的优缺点。在Snowflake基础上,进行了定制化改造以适应更高的并发和扩展需求。同时,讨论了ID还原的技术细节,以及在实际项目中如何为服务器分配不重复的workId。
摘要由CSDN通过智能技术生成

        在项目中,碰到需要按一定规则来生成数据库ID的主键,这样以后数据量达到一定规模是,可以很方便的通过主键id来实现分库分表,查了一些资料,将一些常用ID生成策略的方法及优缺点了解了一下。

 

1、数据库自增主键

优点:简单;唯一;递增;增幅固定

缺点:写性能决定每秒生成数量上限,扩展差;分布式数据库,主节点挂掉,备节点上时可能有问题(主节点写入成功,日志未同步到备节点,导致id重复)

备注:可有一个写库变成多个库同时写,如1、2、3三个库同时写,初始id分别为1、2、3,自增幅度都为3。这种方式可保证id不重复。但导致id不是绝对递增,而是整体趋势上递增;其次是写入的压力仍然很大,mysql容易成为性能瓶颈。

2、数据库批量生成id

优点:效率高;降低数据库压力

缺点:需考虑安全性问题,防止取到重复id;如果业务需求是每次只生成一个id,性能有问题

备注:利用数据库,初始化一行数据,初始值为1,取10个id,就给该值加10,调用端取返回id值的前10个数值。以上即为批量生成id思路。

3、UUID

优点:本地生成;效率高

缺点:UUID字符串过长,且无实际意义;无法保证递增趋势;建立的索引查询效率低

4、当前时间毫秒与微秒

优点:本地生成;延时低;索引性能高

缺点:1秒内请求过1000后id肯定重复,微秒同理

5、zookeeper生成id

利用zookeeper增加版本号的方式是其中一种。建立节点,每次使节点版本加1。

优点:利用zk集群解决单点问题

缺点:性能不高;id有上限,提供32位id;需要zk服务

参考代码:https://blog.csdn.net/gongzi2311/article/details/58144091

6、snowflake算法

twitter开源分布式生成id算法。

优点:基本解决了所有问题

缺点:每个节点时间可能不同,生成id是整体趋势递增的

参考代码:https://blog.csdn.net/gongzi2311/article/details/58189306

 

ID的生成

        经过整体评估,每秒的并发量、后期可能扩展的服务器数量、数据库数量、供应商增长速度等,最终在snowflake算法的基础上做了一些修改,结构如下:

---------------------------------------------------------
|    1    |    39    |    1    |    7    |    8    |    8    |
---------------------------------------------------------
|    A    |     B    |    C    |    D    |    E   |    F    |

 

共64位
A:符号位(0);
B:时间差(当前时间与固定时间的差值)
      2^39 = 549755813888
      每年毫秒数 = 31536000000
      使用年限 = 2^39 / 1000 * 60 * 60 *24 *365 = 17年
C:dataCenter(数据中心)
      支持2个数据中心
D:workId(服务器)
      最多可扩展到128台服务器
E:序列
      每毫秒256个序列
F:供应商id
      最多支持256个供应商

        关于ID生成的具体算法,可以参考snowfla

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值