唯一id生成算法


​ 我们在很多情况下都需要用到一个唯一标识,比如一个用户id,一个订单号等等。因此,我们需要设计一种算法来保证标识的唯一性。

​ 具体算法:

UUID 和 GUID

​ UUID含义是通用唯一识别码,让分布式系统中的所有元素,都能有唯一的辨识

数据库自增主键

​ 这种实现方式特别简单,但是不能对数据库进行分表操作,否则id就会重复。

数据库自增主键优化

​ 让数据库中不同的表从不同的下标开始,每次自增n(n为表的个数),这样就解决了重复问题。

​ 但是不便于日后维护,因为以后再新扩建一个表就十分麻烦

数据库自增主键再优化

​ 单独使用一张(或固定几张)数据库表专门来产生自增id。后序不再重新分表,数据量大时可以删除早一些时候产生的数据。

时间戳

​ 用当前时间戳作为唯一id。这样有个缺点,在同一时间生成的id重复

snowflake

​ 对于时间戳来说,如果同一时间有多个请求进来,可以在时间戳后接上一个数字(通过锁机制来实现每次递增,每毫秒清零重新计数)

​ 上述解决了高并发问题,而无法解决分布式环境下。我们可以在时间戳+计数的基础上拼接上机器的id。

​ 但是可能在不同的数据中心,机器id编号相同,这样就可以继续拼接上数据中心的id。

​ 这样做可以实现id的唯一性,且长度适中,算法较为简单。

算法为递增的优势

​ 递增对IO友好,尽可能的使数据靠近在一起,就不需要频繁的抬起磁头,一直写会快很多。对于一些大型分布式数据库,比如HBase,ElasticSearch等都是利用顺序写来提高写性能。

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值