数据库id自增方案

时间:2024-10-16 07:24:06

在数据库设计中我们要遵循2个原则:
1.整形
2.自增
原因是索引低层是会进行默认排序的,如果是字符串,需要每个字母对比才能比较大小,比较耗费性能。
整形只需要对比一次。

如何让数据库主键id自增

美团leaf id 自增方案

专门提供一张维护其他业务的自增id,每台服务器一次取1000 个放入服务内存,然后再内存中订单号++,相当于每1000个订单才和数据库交互一次,可以抗住高并发,而且可以横向扩展。
如果出现多台机器同时读取数据库怎么办? 可以先缓存,比如服务器中的id到了200,就先去拉取下一次的,避开并发请求,实现双buffer 缓存。

雪花算法

雪花算法由41位时间戳+10位机器ip+12位二进制位组成,12位二进制 可以表示 0-4095 。相当与每毫秒一台机器就可以支持4096个订单。

源码走读,实现逻辑:
先获取时间戳,然后获取序号,同一毫秒内序号递增,如果递增数量超过4096 while 循环1毫秒,重新获取时间戳。

时间回拨问题

在使用Snowflake算法的系统中,如果系统时钟回拨,可能会生成重复的ID。这是因为算法依赖于系统时钟来保证ID的唯一性,如果时钟回拨到了之前的某个时间点,系统可能会生成与之前相同的时间戳,从而导致ID冲突。
分场景处理

  1. 回拨的时间很短,100 毫秒以内 ,可以sleep 等待
  2. 时间比较长 100 毫秒-1秒 ,可以维护之前1秒内的所有毫秒的max seq 缓存,获取之前的max seq+1
  3. 对于时间很长的情况,可以抛出异常重新请求,线上一台机器回拨,不会所有机器都回拨。然后再用时间同步机制进行补偿