-
利用数据库的自增主键
- 主键自增来生成递增的id主键
- 缺点: 单机单点故障,不能支撑足够的并发量
- 改进: 改成多机自增主键,每台机器设置不同的起始值,相同的自增步长实现唯一id
-
构建唯一id服务
- 底层数据库记录最新的max_id值,上层构建genSeqid服务每笔从下游数据库去到max_id,生成一个ids池,上游需要id直接从ids池中去取,如果取完了,继续从下游数据库拿到max_id,继续生成一定长度的id序列号提供服务
- eg:数据库起始max_id=0,genseqid服务拿到0然后生成10个序列号[0-9],同时更新max_id=10
- 目前据我理解:美团的leaf就是基于ids池来实现唯一id
-
twitter的snowflake算法:
- 高位41位表示表示毫秒数,最高位0表示符号
- 中位10位表示机器编号
- 低位12为表示一毫秒内的序列号0
- 在统一毫秒类,毫秒+机器号+序列号 每个请求都加锁利用atomic获取自增的id序列号,如果当前的序列号大于212就让这个请求等待到下一秒
- 这种算法理论上单机每秒可以实现1000*212sup>个id,足以满足业务的需求
-
号外: 乐观锁+悲观锁
- 这里一直是我的知识盲区:还要继续踩