阅读 832

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

image.png

1.3. 配置ID生成策略

image.png

2.UUID生成器

ShardingJdbc内置ID生成器实现类有UUIDShardingKeyGenerator和SnowflakeShardingKeyGenerator。

image.png

3. SnowFlake 算法

SnowflakeShardingKeyGenerator 有兴趣的可以阅读一下这个源码

3.1 雪花算法概述

雪花算法生成的ID是纯数字且具有时间顺序的。其原始版本是scala版,后面出现了许多其他语言的版本如Java、C++等。

3.2 基本原理

image.png

大致由:首位无效符、时间戳差值,机器(进程)编码,序列号四部分组成。

基于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.

image.png


作者:伯仁
链接:https://juejin.cn/post/7025222394167951373


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐