在传统企业软件开发中,主键自动生成技术是基本需求,各个数据库对于该自增主键的需求提供了相应的支持,如MySQL的自增键。对于MySQL而言,分库分表之后,不同库、不同表生成全局唯一的主键是非常麻烦的事情。因为同一个逻辑表内的不同物理表之间的自增主键是无法互相感知的,这样会生成重复的主键。
目前有许多第三方解决方案可以完美解决这个问题,比如UUID等依靠特定算法自生成不重复键,或者通过引入主键生成服务(Redis或者ZooKeeper)等。
Sharding-JDBC提供了注解生成接口KeyGenerator。各个实现类通过实现generateKey()方法即可对外提供生成主键的功能。下面分析Sharding-JDBC分布式主键的使用。
DefaultKeyGenerator是Sharding-JDBC默认的主键生成器。该主键生成器采用Twitter Snowflake算法实现生成64位的Long型编号。国内很多大型互联网公司发号器服务基于该算法加部分改造实现。下面分析DefaultKeyGenerator产生的编号的组成。
DefaultKeyGenerator生成的64位Long型编号的组成如图所示。
64位Long型编号中各个部分的如表所示。
位数
含义
取值范围
1
符号位
0
41
时间戳
从2016-11-01 00:00:00 开始的毫秒数,支持约70年
10
工作进程编号
最大进程编号1024
12
序列号
每毫秒从0开始自增,每毫秒最多4096个编号,每秒最多4096000个编号