唯一id生成算法

文章目录

      • UUID 和 GUID
      • 数据库自增主键
      • 数据库自增主键优化
      • 数据库自增主键再优化
      • 时间戳
      • snowflake
      • 算法为递增的优势

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

​ 具体算法:

UUID 和 GUID

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

数据库自增主键

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

数据库自增主键优化

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

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

数据库自增主键再优化

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

时间戳

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

snowflake

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

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

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

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

算法为递增的优势

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

转载请注明出处!!!

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

你可能感兴趣的:(思维,算法之美)