产生背景:
在分布式集群的环境下,大量业务需要唯一的id进行校验、存储,如系统登录用户的唯一标识,商品订单号、物流订单号等,都需要在集群环境下全局唯一。
主键要求必备特性:
1)唯一性,避免特定范围内冲突
2)有序性,按照某种规则插入数据库,且有序的排列
3)可用性,高并发下确保能生成正确的ID
4)自主性,不依赖其他组件、认证可自行生成
5)安全性,不暴露业务信息
解决方案:
数据库自增长序列或字段。
优点:生成比较简单且有序,方便分页
缺点:
1.只有一个数据库时,需考虑分库分表后容易重复,且性能可能会跟不上
2.主从数据库时需设置主写从读,防止自增序列被破坏
3.双主数据库时,需设置两台主节点的生成序列奇偶不同
4.吞吐量较低
UUID。
优点:高性能、低延迟
缺点:数据不规则生成 会导致索引失效
Redis 生成 ID
通过redis的incr/incrby生成
优点:相比于数据库,吞吐量更大了
缺点:宕机后无法找回最新的ID
Twitter 的snowflake 算法
雪花算法按照:时间(毫秒级)+集群ID+机器ID+序列号生成,每部分生成可自行配置, 集群和机器ID 两部分需依赖数据库记录或者外部参数配置
优点:高性能、低延迟、按时间有序
缺点:环境时间回拨时可能出现重复ID
利用 zookeeper 生成唯一 ID
优点:本地生成,非常简单,代码方便,API调用方便。生成的id性能非常好,没有网络消耗,基本不会有性能问题。全球唯一。
缺点:宕机后无法找回最新的ID,且通过节点生成的ID上限是整型的最大值,高并发下需使用分布式锁,uuid无序,存储成本高。信息不安全
MongoDB 的 ObjectId