如何让生成ID时不会有重复的呢?

如何实现不重复的id生成呢?

以下就是小编为大家整理的方案:

第一个就是UUID

UUID 是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字

UUID由以下几部分的组合:

(1)41位的时间序列(精确到毫秒,41位的长度可以使用69年)

(2)10位的机器标识(10位的长度最多支持部署1024个节点)

(3)12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) 最高位是符号位,始终为0。

优点:本地生成,数据库压力减轻了

缺点:长度过长,而且还是无序的

第二个就是基于数据库生成

单独搞一台数据库,

设置自动增长,用于记录增长值

然后所有id生成都去请求它

优点:简单,高效

缺点:需要单独部署,大并发下性能比较低

第三个 Twitter的snowflake算法

snowflake的结构如下(每部分用-分开):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年),然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点) ,最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)

一共加起来刚好64位,为一个Long型。(转换成字符串后长度最多19)

snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。经测试snowflake每秒能够产生26万个ID。

优点:生成的id是Long类型,递增

缺点:每台机器上的时间不一样,会产生不了递增的情况

第四个 redis生成id

redis是很好用的缓存。

Redis是单线程的,所以也可以用生成全局唯一的ID。

优点:数字ID天然排序,对分页或者需要排序的结果很有帮助,高并发也行,可以设置Redis集群来生成。

缺点:redis配置有些麻烦,代码量多。

如果大家有更好的方式方法,欢迎大家留言评论,一起进步如果有想学习web前端的小伙伴,

可以加入我的学习qun:68795,

8461,小编是一名从事了5年前端开发的全栈工程师,现在辞职,

在做线上教育,免费送一套Web前端资料、教程哦。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181207A0VALT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券