雪花算法+sharding-jdbc实现分表

1. 雪花算法

雪花算法原理和实现网上都很多,大家自行搜索,但是网上的基本都存在一个问题,由于每毫秒从0开始计数,如果id生成不频繁,即每毫秒只会生成一个甚至几毫秒才需要生成一个,那么计数器就永远都是0,生成的id用于取模分表的话,就会出现永远都是插入到一个表(或规律的那几个表),无法达到均匀分布在各表的目的,所以我这里做了一下优化,能让生成的id达到均匀分布在各表的目的

思路是:原sequence现只用来控制一毫秒内生成的id不会超过4096个(这个数跟配置的MAX_SEQUENCE有关),重新定义一个变量actualSequence用来在0-4095间循环,这样就能让生成的id达到均匀分布在各表的目的,具体代码见gitee地址雪花算法+sharding-jdbc实现分表

2. sharding-jdbc实现分表

先实现好单表的功能,启动好,能实现单表的功能,然后继续。

首先,需要在mysql数据库建好你要分的表,例如我这里是0-7共8个order表,t_order_0到t_order_7

CREATE TABLE `t_order_0` (
  `id` bigint(20) unsigned NOT NULL COMMENT '主键',
  `price` decimal(10,2) NOT NULL COMMENT '单价',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用户id',
  `status` varchar(16) DEFAULT NULL COMMENT '状态',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单0表';

加上shardingsphere和druid数据源的依赖

<dependency>
	<groupId>org.apache.shardingsphere</groupId>
	<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
	<version>4.1.1</version>
</dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
	<version>1.1.21</version>
</dependency>

数据库连接的配置文件改成

# 自定义数据源
spring.shardingsphere.datasource.names = m1
spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name = com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/order_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.shardingsphere.datasource.m1.username = root
spring.shardingsphere.datasource.m1.password = 123456

# 以下是分片规则配置
# 指定t_order表的数据分布情况,配置数据节点
# t_order 逻辑表名
# insert into t_order () values ()
# $->{0..7} => 1, 2, 3, 4, 5, 6, 7 => t_order_0,t_order_1,t_order_2...
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes = m1.t_order_$->{0..7}

# 指定t_order表的分片策略,分片策略包括分片键和分片算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column = id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression = t_order_$->{id % 8}

然后就可以了,就这么简单
详细代码可以参见gitee地址雪花算法+sharding-jdbc实现分表

宁静致远!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值