分布式id
特点
全局唯一,递增,包含时间部分,高可用。
方案
- UUID
思想:结合机器物理特征(网卡、时间)生成
优点:快,无需库,无单点故障
缺点:无序,字符串查询效率低 -
数据库自增ID
思想:mysql的auto_increment,不同机器step不同
优点:简单,有序
缺点:有单机性能瓶颈(需分库分表),有单点问题(需主从) -
批量生成ID
思想: 一次生成多个ID入库,在缓存中记录最大ID
优点:避免查库提升性能
缺点:易造成id不连续 -
Redis生成ID
思想:由于redis执行命令是单线程的,容易保障原子性,所以能保证id全局唯一
优点:性能高,
缺点:引入中间件导致系统复杂度提升 -
Twitter的snowflake算法(重点)
思想:利用zk强一致性实现
1位符号位:
由于 long 类型在 java 中带符号的,最高位为符号位,正数为 0,负数为 1,且实际系统中所使用
的ID一般都是正数,所以最高位为 0。
41位时间戳(毫秒级):
需要注意的是此处的 41 位时间戳并非存储当前时间的时间戳,而是存储时间戳的差值(当前时间戳 – 起始时间戳),这里的起始时间戳一般是ID生成器开始使用的时间戳,由程序来指定,所以41位毫秒时间戳最多可以使用 (1 << 41) / (1000x60x60x24x365) = 69年 。
10位数据机器位:
包括5位数据标识位和5位机器标识位,这10位决定了分布式系统中最多可以部署 1 << 10 = 1024s个节点。超过这个数量,生成的ID就有可能会冲突。
12位毫秒内的序列:
这 12 位计数支持每个节点每毫秒(同一台机器,同一时刻)最多生成 1 << 12 = 4096个ID
加起来刚好64位,为一个Long型
优点:高性能,递增,有序
缺点:依赖于时钟,需独立开发部署
-
百度UidGenerator
思想:snowflake算法实现
优点:
缺点: -
美团Leaf
思想:
优点:
缺点: