短链平台开发-sharding-jdbc实战(精准分片策略)

short_link模块需要进行分库分表

        短链码生成解决方案

                进行62位进制转换,得到需要的数字+大小写字母的短链码

        分库分表实操

,生成一个新的短链码用于精准选择分库分表。

这样分库分表的优点:

        甚至可以避免数据迁移和数据扩容等问题解决。

实操如下

application.yml

spring:
    shardingsphere:
         tables:
            short_link:
               database-strategy:
                standard:
                  sharding-column: code
                  precise-algorithm-class-name: net.xdclass.strategy.CostomDBPreciesShardingAlgorithm
              # 真实数据表节点
              actual-data-nodes: ds0.short_link,ds1.short_link,dsa.short_link
              # 水平分表策略、自定义策略 真实库、逻辑表
              table-strategy:
                standard:
                  sharding-column: code
                  precise-algorithm-class-name: net.xdclass.strategy.CostomTablePreciesShardingAlgorithm

 CostomDBPreciesShardingAlgorithm
package net.xdclass.strategy;

import net.xdclass.enums.BizCodeEnum;
import net.xdclass.exception.BizException;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.Collection;


public class CostomDBPreciesShardingAlgorithm implements PreciseShardingAlgorithm<String> {


    /**
     *
     * @param availableTargetNames 数据源集合
     *                             在分库时值为分片库的集合 databaseNames
     *                             分表时对应分片库中所有分片表的集合 tablesNames
     *
     * @param shardingValue sharding value  分片属性,包括
     *                                      logicTableName 为逻辑表
     *                                      cloumnName 分片键(字段)
     *      *                               value 为从SQL中解析出的分片键的值
     * @return
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
        /**
         * 获取短链码第一位,即库位
         */
        String codePrefix = shardingValue.getValue().substring(0,1);
        for (String targetName : availableTargetNames) {
            //获取库名的最后一位,真正配置的ds
            String targetNameSuffix = targetName.substring(targetName.length()-1);
            if (codePrefix.equals(targetNameSuffix)){
                return targetName;
            }
        }
        //抛异常
        throw  new BizException(BizCodeEnum.DB_ROUTE_NOT_FOUND);
    }
}
CostomTablePreciesShardingAlgorithm
package net.xdclass.strategy;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.Collection;


public class CostomTablePreciesShardingAlgorithm implements PreciseShardingAlgorithm<String> {

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {

        //获取逻辑表
        String targetName = availableTargetNames.iterator().next();
        //短链码 Asdag1
        String code = shardingValue.getValue().toString();
        //获取短链码最后一位
        String codeSuffix = code.substring(code.length() - 1);

        return targetName+"_"+codeSuffix;
        
    }
}

缺点:

无法保证是数据分布不均衡问题,产生新库数据<旧库数据。

解决方案 

        类似于nginx的加权负载均衡。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值