分布式 ID 介绍
分布式 ID:单体MySQL无法支撑业务,需要分库分表(推荐 Sharding-JDBC),需要为不同的数据节点生成全局唯一主键 需要满足:
- 全局唯一:不能重复
- 高性能:速度快,消耗少。
- 高可用:可用率高。
- 方便易用:简单易用
- 安全:ID 中不包含敏感信息。
- 有序递增:插入等操作更快
分布式 ID 常见解决方案
- 数据库号段:每次将一段数据库 ID 放在缓存中,新增时获取
- 简单、有序
- 通过 ID 可以推算出增量(信息泄露 )
- Redis:通过 Redis 的
incr命令- 和数据库号段类似
- MongoDB ObjectId:12 个字节
- 0~3:时间戳
- 3~6:代表机器 ID
- 7~8:机器进程 ID
- 9~11:自增值
- 性能不错,且 ID 有序
- 机器时间不对,可能生成重复 ID
- UUID 是 Universally Unique Identifier(通用唯一标识符):
- 32 个 16 进制数字(8-4-4-4-12)
- 全局唯一
- 但是长度太长,无序,机器时间长可能重复 ID 等问题
- Snowflake(雪花算法):64bit
- 生成速度快、有序、可以改造比较灵活
- 机器时间不对可能出现重复 ID
- UidGenerator(百度):基于雪花算法的 ID 生成器
- Leaf(美团):支持号段和雪花算法两种模式
- Tinyid(滴滴):基于号段的生成器
