常用UniqueID的生成方法
这几天在与其他的系统进行联调的时候,出现了对方的唯一ID使用的是Int32
来存储,而我们提供的UniqueID是标准的UUID,从而导致他们无法存储的问题.由于他们是一个历史的老系统,牵扯很深,所以无法进行改造,只能我们来适应它(幸好和它们交互的数据不会太多.应该不会超过Int32的上限).从而引出了对UniqueID生成方法的思考.这里列出了几种常用的UniqueID的生成办法.
基于数据库的发号器
这个是最常见和最容易想到的生成UniqueID的方法.也就是依赖数据库的自增ID来获取唯一ID,由于在分布式系统中数据库都是做了分布式或同步的,因此能保证数据库的自增键或序列是不会重复的.
- 在Oracle中,可以创建一个序列,然后使用序列的
nextVal
来获取. - 在Mysql中,由于没有序列的概念,只能创建一个表,表的主键设置为自增.要获取UniqueID的时候就不断的往这个表中插入记录,获取
last_insert_id()
即可.为了避免表的记录数过多,可以考虑采用使用回滚的方式来规避. - 在redis中,可以使用
INCR key
这个命令来获取一个自增的key,每调用一次,key值增加1.如果没有这个key值,则初始化key值为0.
使用这种方案的优点就是可以满足像Int32
这种短数据的唯一.而缺点就是增加了系统的复杂性.需要在系统中强依赖数据库,并且获取UniqueID
是需要与数据库交互的,虽然可以一次批量的获取几个ID,但是总体来说,性能会有损失.