小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
大部分场景按照MySQL主键ID自增就OK了,但是有些分库分表之后需要全局唯一的ID,标识唯一性。比如会员表的会员ID, 订单表的订单ID, 营销的券ID等等。
sharding-jdbc提供了两种主键生成策略UUID、SNOWFLAKE
,默认使用SNOWFLAKE,其对应实现类为UUIDShardingKeyGenerator和SnowflakeShardingKeyGenerator。
除了以上两种内置的策略类,也可以基于ShardingKeyGenerator,定制主键生成器。
- 自定义主键生成器
1.1 自定义代码 MyShardingKeyGenerator
1 | java复制代码import lombok.Data; |
1.2.SPI接口配置
在Apache ShardingSphere中,很多功能实现类的加载方式是通过SPI注入的方式完成的。 Service Provider Interface (SPI)是一种为了被第三方实现或扩展的API,它可以用于实现框架扩展或组件替换。
Apache ShardingSphere之所以采用SPI方式进行扩展,是出于整体架构最优设计考虑。 为了让高级用户通过实现Apache ShardingSphere提供的相应接口,动态将用户自定义的实现类加载其中,从而在保持Apache ShardingSphere架构完整性与功能稳定性的情况下,满足用户不同场景的实际需求。
添加如下文件:META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator,
文件内容为:com.sharding.jdbc.demo.util.MyShardingKeyGenerator
1.3. 配置ID生成策略
2.UUID生成器
ShardingJdbc内置ID生成器实现类有UUIDShardingKeyGenerator和SnowflakeShardingKeyGenerator。
- SnowFlake 算法
SnowflakeShardingKeyGenerator 有兴趣的可以阅读一下这个源码
3.1 雪花算法概述
雪花算法生成的ID是纯数字且具有时间顺序的。其原始版本是scala版,后面出现了许多其他语言的版本如Java、C++等。
3.2 基本原理
大致由:首位无效符、时间戳差值,机器(进程)编码,序列号四部分组成。
基于Twitter Snowflake算法实现,长度为64bit;64bit组成如下:
- 1bit sign bit.
- 41bits timestamp offset from 2016.11.01(Sharding-JDBC distributed primary key published data) to now.
- 10bits worker process id.
- 12bits auto increment offset in one mills.
3.3 雪花算法生成
雪花算法生成我们直接用Hutool中的工具类,直接实现
本文转载自: 掘金