其实,这个全局唯一ID的问题,我并没有觉得很特别,甚至我觉得,如果生成全局唯一ID的时候,能把用户ID+时间戳也基本可以满足大部分业务的“全局唯一”的需求了。确实,生成全局ID的方法有很多,适应不同的场景、需求以及性能要求,所以即便是同一个系统,你也根据不同的业务场景设计不同的ID生成策略。
UUID
一种本地生成ID的方法,缺点是无法保证趋势递增,uuid过长,往往用字符串表示,作为主键建立索引查询效率低
使用数据库的 auto_increment 来生成
使用现有数据库生成,但是往往数据库很容易成为性能瓶颈,另外数据库要做HA,保证生成ID高可用
SnowFlake 算法
SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图
SnowFlake可以保证:所有生成的id按时间趋势递增,整个分布式系统内不会产生重复id。但是因为机器的原因会发生时间回拨,我们的雪花算法是强依赖我们的时间的,如果时间发生回拨,有可能会生成重复的ID。SnowFlake示例代码如下:
关注公众号“一米源码”发送消息“Snow”获取示例源码