本文概览:介绍了四种

方案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、组成架构
81238710
  • 时间搓。41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年。用(当前时间戳 – 固定开始时间戳 )的差值,可以使产生的ID从更小的值开始。
  • 工作机器ID。机房或者机器号组合都可以。
  • 序列号不符。自增值支持同一毫秒内同一个节点可以生成4096个ID。atomicInteger来实现。
2、为什么是64位?正好是8个字节,long类型。

方案 3 REDIS

Redis也同样可以实现,原理就是利用redisincr命令实现ID的原子性自增。

用redis实现需要注意一点,要考虑到redis持久化的问题,就是redis宕掉之后,无论哪一种持久化方式都会导致订单号重复,如RDB方式,RDB会定时打一个快照进行持久化,假如连续自增redis没及时持久化,而这会Redis挂掉了,重启Redis后会出现ID重复的情况。

方案4  UUID

只是全球唯一标识,但是不是数字。

分类&标签