本文概览:介绍了四种
方案1 自建服务
1、思路
每个服务一个记录,然后通过select..for update来更新这个记录
- 序列号服务启动时候,都会获取一个号段,以步长,0-100,100-200
- 实例的号段用完之后,再去查询数据库获取200-300。
2、序列号生成表
服务ID、step、beg 、current、max。
- step,步长,避免一直请求数据库
- current,记录当前只,下次获取是 current,current+step
- max,最大值,等待最大值时,进行清0操作。
- beg,序列号起始值。
方案2 雪花算法
1、组成架构
- 时间搓。41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年。用(当前时间戳 – 固定开始时间戳 )的差值,可以使产生的ID从更小的值开始。
- 工作机器ID。机房或者机器号组合都可以。
- 序列号不符。自增值支持同一毫秒内同一个节点可以生成4096个ID。atomicInteger来实现。
2、为什么是64位?正好是8个字节,long类型。
方案 3 REDIS
Redis
也同样可以实现,原理就是利用redis
的 incr
命令实现ID的原子性自增。
1 2 3 4 |
127.0.0.1:6379> set seq_id 1 // 初始化自增ID为1 OK 127.0.0.1:6379> incr seq_id // 增加1,并返回递增后的数值 (integer) 2 |
用redis实现需要注意一点,要考虑到redis持久化的问题,就是redis宕掉之后,无论哪一种持久化方式都会导致订单号重复,如RDB方式,RDB会定时打一个快照进行持久化,假如连续自增redis没及时持久化,而这会Redis挂掉了,重启Redis后会出现ID重复的情况。
方案4 UUID
只是全球唯一标识,但是不是数字。