常用ID解决方案
数据库自增id
- 依靠数据库系统的功能实现,但是未来扩容麻烦
- 主从切换时的不⼀致可能会导致重复发号
- 性能瓶颈存在单台sql上
UUID
- 性能非常高,没有网络消耗
- 无序的字符串,不具备趋势自增特性
- UUID太长,不易于存储,浪费存储空间,很多场景不适用
Redis发号器
利用Redis的INCR和INCRBY来实现,原子操作,线程安全,性能比Mysql强劲
需要占用网络资源,增加系统复杂度
Snowflake雪花算法
雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法
ID在内存生成,不依赖于数据库,高性能高可用
每秒可生成几百万ID,容量大
由于ID呈趋势递增,插入数据库后,使用索引的时候性能较高
代码实现简单、不占用宽带、数据迁移不受影响
生成的 id 中包含有时间戳,所以生成的 id按照时间递增
部署了多台服务器,需要保证系统时间⼀样,机器编号不⼀样
依赖系统时钟(多台服务器时间⼀定要⼀样)
Snowflake生成的是Long类型的ID,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特