ShardingSphere基于分片容量的范围分片算法(VOLUME_RANGE)的使用和理解(二)

基于分片容量的范围分片算法
注意事项:

1、基于分片容量的范围分片可以支持分库又分表,但是要注意一个问题,如果分库分表的话
当设置分表策略的的时候要注意应该按照单库的策略去分否则就会报错。
2、基于分片容量的范围分片 分片字段要是一个long类型的数据,否则也不行
3、基于分片容量的范围分片 要预估数据的总量,相当于预估数据的上限,使用起来比较局限
下边举例:
共80个数据,分2个库,每个库分两张表,逻辑图如下:

在这里插入图片描述

共80个数据,分1个库,每个库分两张表,逻辑图如下:

在这里插入图片描述

根据上边说的设置表分片的时候应该按照如下的举例设置:
下边设置的意思是 [1-41)放在 d0和d1库中的m_user_0中 d0.m_user_0+d1.m_user_0=40条数据,表m_user_1道理一样
那么d0的m_user_0和d1的m_user_0各放多少数据取决于 分库的策略,总之要满足 d0.m_user_0+d1.m_user_0=40条数据

再说一下参数的含义
range-lower=41 表示分片字段的一个下限
range-upper= 81 表示分片字段的最大上限
sharding-volume= 40 表示分片的容量

[1-41) m_user_0 [41-81) m_user_1

#lcg_user表的分表的策略
spring.shardingsphere.rules.sharding.tables.m_user.actual-data-nodes=d$->{0..1}.m_user_$->{0..1}
#配置表的分片算法
spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.standard.sharding-column=price
#这里的算法名称自己随便取
spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.standard.sharding-algorithm-name=fan-wei

#配置具体的分表的算法-使用MOD,这时候一般是使用INLINE表达式
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.type=VOLUME_RANGE
#这里是开区间 [0-21)的意思 就是不包含21 设置数据的时候要注意 这里之所以不是
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.range-lower= 41
#范围分片的最大范围上限 这里是开区间 [0-81)的意思 就是不包含81 设置数据的时候要注意
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.range-upper= 81
#每个分片的容量(每个分片最多)
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.sharding-volume= 40

下边给出一个完整的基于分片容量的范围分片且分库分表配置案例:(如果是单个库的话去掉分库策略,修改actual-data-nodes数据节点是单个就可以了)

#打印sql
spring.shardingsphere.props.sql-show=true

#数据库的分库策略
spring.shardingsphere.rules.sharding.tables.m_user.database-strategy.complex.sharding-columns=buMen,sex
spring.shardingsphere.rules.sharding.tables.m_user.database-strategy.complex.sharding-algorithm-name=complex-db
spring.shardingsphere.rules.sharding.sharding-algorithms.complex-db.type=CLASS_BASED
#策略的名称 complex 时必选
spring.shardingsphere.rules.sharding.sharding-algorithms.complex-db.props.strategy=complex
#算法名称 complex 时必选
spring.shardingsphere.rules.sharding.sharding-algorithms.complex-db.props.algorithmClassName=com.shardings.selfdefined.MyComplexShardingAlgorithmDB

#lcg_user表的分表的策略
spring.shardingsphere.rules.sharding.tables.m_user.actual-data-nodes=d$->{0..1}.m_user_$->{0..1}
#配置表的分片算法
spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.standard.sharding-column=price
#这里的算法名称自己随便取
spring.shardingsphere.rules.sharding.tables.m_user.table-strategy.standard.sharding-algorithm-name=fan-wei

#配置具体的分表的算法-使用MOD,这时候一般是使用INLINE表达式
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.type=VOLUME_RANGE
#这里是闭区间 [0-21)的意思 就是包含21 设置数据的时候要注意
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.range-lower= 41
#范围分片的最大范围上限 这里是开区间 [0-81)的意思 就是不包含81 设置数据的时候要注意
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.range-upper= 81
#每个分片的容量(每个分片最多)
spring.shardingsphere.rules.sharding.sharding-algorithms.fan-wei.props.sharding-volume= 40


# 配置lcg_user的id采用雪花算法生成全局id策略
spring.shardingsphere.rules.sharding.tables.m_user.key-generate-strategy.column=id
spring.shardingsphere.rules.sharding.tables.m_user.key-generate-strategy.key-generator-name=SNOWFLAKE

数据库分片算法的实现:(下边的代码只是一个简单的示例,大家不要拘泥于这种数据库分片方式)

package com.shardings.selfdefined;

import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingAlgorithm;
import org.apache.shardingsphere.sharding.api.sharding.complex.ComplexKeysShardingValue;

import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;

/**
* @author: LCG
* @date: 2022-11-12 18:52:43
* @description: 自定义 多字段分片算法 按照数据库划分
**/
@Slf4j
public class MyComplexShardingAlgorithmDB implements ComplexKeysShardingAlgorithm<String> {

    private static final String column1="buMen";

    private static final String column2="sex";

    /**
     * @author: LCG
     * @date: 2022-11-12 23:19:16
     * @description:  collection  数据库的逻辑名称集合
     *                complexKeysShardingValue  复合分片字段的字段名和字段值
     */
    @Override
    public Collection<String> doSharding(Collection<String> collection, ComplexKeysShardingValue<String> complexKeysShardingValue) {

        String logicTableName = complexKeysShardingValue.getLogicTableName();

        Map<String, Collection<String>> columnNameAndShardingValuesMap = complexKeysShardingValue.getColumnNameAndShardingValuesMap();

        Collection<String> c1 = columnNameAndShardingValuesMap.get(column1);

        Collection<String> c2 = columnNameAndShardingValuesMap.get(column2);

        if(Optional.ofNullable(c1).isPresent()&&Optional.ofNullable(c2).isPresent()){

            StringBuffer sb=new StringBuffer(c1.stream().findFirst().get());
            sb.append(c2.stream().findFirst().get());

            int i = sb.toString().hashCode() % collection.size();

            String s = i == 0 ? "d0" : "d1";

            return Arrays.asList(s);
        }

        return collection;
    }


    @Override
    public void init() {

    }

    @Override
    public String getType() {
        return "COMPLEX-DB";
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值