1. UUID/GUID (通用唯一识别码)
1.1 UUID/UUID组成
- 当前日期和时间
- 时钟序列
- 全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得)
1.2 UUID/UUID优势
- 使用简单
- 全球唯一
- 性能好
1.3 UUID/UUID缺点
- 存储字符串,太长,占用空
- 查询效率低
- 生成的ID不易理解
- 不能递增,不能排序
1.4 变种UUID
- 为了解决UUID不可读,可以使用UUID to Int64的方法。
- 为了解决UUID无序的问题,NHibernate在其主键生成方式中提供了Comb算法(combined guid/timestamp)。保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime)。
2. 数据库自增长字段
2.1 原理
利用数据库使用auto_increment自增长字段
2.2 优点
- 无需编码
- 性能可以
- 索引友好
2.3 缺点
- 不能做水平分表,后期扩展麻烦
- 高并发下插入数据影响性能3. 雪花算法
3. 雪花算法
3.1 结构
- 最高位为未使用,
- 接下来的41位为毫秒级时间(41位的长度可以使用69年),
- 接下来的5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点) ,
- 最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)
- 一共加起来刚好64位,为一个Long型。(转换成字符串长度为18)。
3.2 优势
- 存储空间小,查询效率高
- 可以生成有顺序的id
- 性能高,每秒能生成26个ID
4. 基于redis自增
4.1 原理
利用redis的incr(key)用于将key进行自增,并返回增长的数值,redis有如下特性:单线程原子操作、自增计数API、数据有效期机制EX。
4.2 优点
- 扩展性强,可以方便的结合业务进行处理
- 利用redis操作原子性的特性,支持并发
4.3 缺点
- 依赖于redis,需要维护redis集群,保证redis服务的高可用
- 增加网略开销
参考