我们在很多情况下都需要用到一个唯一标识,比如一个用户id,一个订单号等等。因此,我们需要设计一种算法来保证标识的唯一性。
具体算法:
UUID 和 GUID
UUID含义是通用唯一识别码,让分布式系统中的所有元素,都能有唯一的辨识
数据库自增主键
这种实现方式特别简单,但是不能对数据库进行分表操作,否则id就会重复。
数据库自增主键优化
让数据库中不同的表从不同的下标开始,每次自增n(n为表的个数),这样就解决了重复问题。
但是不便于日后维护,因为以后再新扩建一个表就十分麻烦
数据库自增主键再优化
单独使用一张(或固定几张)数据库表专门来产生自增id。后序不再重新分表,数据量大时可以删除早一些时候产生的数据。
时间戳
用当前时间戳作为唯一id。这样有个缺点,在同一时间生成的id重复
snowflake
对于时间戳来说,如果同一时间有多个请求进来,可以在时间戳后接上一个数字(通过锁机制来实现每次递增,每毫秒清零重新计数)
上述解决了高并发问题,而无法解决分布式环境下。我们可以在时间戳+计数的基础上拼接上机器的id。
但是可能在不同的数据中心,机器id编号相同,这样就可以继续拼接上数据中心的id。
这样做可以实现id的唯一性,且长度适中,算法较为简单。
算法为递增的优势
递增对IO友好,尽可能的使数据靠近在一起,就不需要频繁的抬起磁头,一直写会快很多。对于一些大型分布式数据库,比如HBase,ElasticSearch等都是利用顺序写来提高写性能。
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢