ShardingJDBC 主键生成策略

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

大部分场景按照MySQL主键ID自增就OK了,但是有些分库分表之后需要全局唯一的ID,标识唯一性。比如会员表的会员ID, 订单表的订单ID, 营销的券ID等等。

sharding-jdbc提供了两种主键生成策略UUID、SNOWFLAKE ,默认使用SNOWFLAKE,其对应实现类为UUIDShardingKeyGenerator和SnowflakeShardingKeyGenerator。

除了以上两种内置的策略类,也可以基于ShardingKeyGenerator,定制主键生成器。

  1. 自定义主键生成器

1.1 自定义代码 MyShardingKeyGenerator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
java复制代码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 "MyAtomicLong";
}

}

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

  1. 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

3.3 雪花算法生成

雪花算法生成我们直接用Hutool中的工具类,直接实现

image.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%