ShardingJDBC 主键生成策略
前言
大部分场景按照MySQL主键ID自增就OK了,但是有些分库分表之后需要全局唯一的ID,标识唯一性。比如会员表的会员ID, 订单表的订单ID, 营销的券ID等等。
sharding-jdbc提供了两种主键生成策略UUID、SNOWFLAKE
,默认使用SNOWFLAKE,其对应实现类为UUIDShardingKeyGenerator和SnowflakeShardingKeyGenerator。
除了以上两种内置的策略类,也可以基于ShardingKeyGenerator,定制主键生成器。
1. 自定义主键生成器
1.1 自定义代码 MyShardingKeyGenerator
import lombok.Data; import org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator; import java.util.Properties; import java.util.concurrent.atomic.AtomicLong; @Data public class MyShardingKeyGenerator implements ShardingKeyGenerator { private AtomicLong atomicLong = new AtomicLong(0); private Properties properties = new Properties(); @Override public Comparable<?> generateKey() { // 单机版本的,分布式的可以用Redis自增等等 return atomicLong.incrementAndGet(); } @Override public String getType() { //声明类型 return "AtomicLong"; } } 复制代码
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。
3. 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.
作者:伯仁
链接:https://juejin.cn/post/7025222394167951373