sharding-sphere分片算法和分片策略

官方文檔:官方文檔

分片算法

類圖:
分片算法.png

所有的分片算法都有一個共同的方法(doSharding),因為參數(shù)不同,所以并沒有在ShardingAlgorithm中體現(xiàn)。代碼如下:

public interface ShardingAlgorithm {
}

public interface HintShardingAlgorithm extends ShardingAlgorithm {
    Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue);
}

public interface ComplexKeysShardingAlgorithm extends ShardingAlgorithm {
    Collection<String> doSharding(Collection<String> availableTargetNames, Collection<ShardingValue> shardingValues);
}

public interface PreciseShardingAlgorithm<T extends Comparable<?>> extends ShardingAlgorithm {
    String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<T> shardingValue);
}
public interface RangeShardingAlgorithm<T extends Comparable<?>> extends ShardingAlgorithm {
    Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<T> shardingValue);
}
分片策略

分片策略.png

分片策略主要有兩個方法,一個是獲取分片項,一個是分片,分片主要是依賴于分片算法做分片,具體代碼如下:

public interface ShardingStrategy {
    //獲取分片項
    Collection<String> getShardingColumns();  
    //做分片
    Collection<String> doSharding(Collection<String> availableTargetNames, Collection<ShardingValue> shardingValues);
}

復(fù)合分片算法實現(xiàn)如下:

public final class ComplexShardingStrategy implements ShardingStrategy {
     //分片項
    @Getter
    private final Collection<String> shardingColumns;
    //分片算法
    private final ComplexKeysShardingAlgorithm shardingAlgorithm;
    
    public ComplexShardingStrategy(final ComplexShardingStrategyConfiguration complexShardingStrategyConfig) {
        shardingColumns = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
        //分片配置中獲取所有的分片項,保存在shardingColumns中。
        shardingColumns.addAll(StringUtil.splitWithComma(complexShardingStrategyConfig.getShardingColumns()));
        //初始化分片算法
        shardingAlgorithm = complexShardingStrategyConfig.getShardingAlgorithm();
    }
    
    @Override
    public Collection<String> doSharding(final Collection<String> availableTargetNames, final Collection<ShardingValue> shardingValues) {
        //調(diào)用分片算法做分片
        Collection<String> shardingResult = shardingAlgorithm.doSharding(availableTargetNames, shardingValues);
        Collection<String> result = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
        //組裝分片結(jié)果并返回
        result.addAll(shardingResult);
        return result;
    }
}

其他分片策略類似。
分片策略的初始化,是按照不同的分片策略配置,分片策略配置如下:


分片配置.png

代碼很簡單,就不列出來了。

分片策略是如何被初始化的?

工廠模式,按照不同的策略配置類型初始化不同的策略。

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ShardingStrategyFactory {
    public static ShardingStrategy newInstance(final ShardingStrategyConfiguration shardingStrategyConfig) {
        if (shardingStrategyConfig instanceof StandardShardingStrategyConfiguration) {
            return new StandardShardingStrategy((StandardShardingStrategyConfiguration) shardingStrategyConfig);
        }
        if (shardingStrategyConfig instanceof InlineShardingStrategyConfiguration) {
            return new InlineShardingStrategy((InlineShardingStrategyConfiguration) shardingStrategyConfig);
        }
        if (shardingStrategyConfig instanceof ComplexShardingStrategyConfiguration) {
            return new ComplexShardingStrategy((ComplexShardingStrategyConfiguration) shardingStrategyConfig);
        }
        if (shardingStrategyConfig instanceof HintShardingStrategyConfiguration) {
            return new HintShardingStrategy((HintShardingStrategyConfiguration) shardingStrategyConfig);
        }
        return new NoneShardingStrategy();
    }
}

the end。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,590評論 19 139
  • 簡介 目前,在所有的區(qū)塊鏈協(xié)議中每個節(jié)點存儲所有的狀態(tài)(賬戶余額,合約代碼和存儲等等)并且處理所有的交易。這提供了...
    編程狂魔閱讀 1,106評論 0 3
  • 今年中秋,風(fēng)有點涼意,天有點暗沉,沒有一點過節(jié)的氣氛。 對團聚的家庭來說,大概中秋的氣氛在廚房里吧,在那裊裊升起的...
    jiauly閱讀 294評論 0 1
  • 喜歡一個人和撩一個人有什么區(qū)別?? 撩的時候騷話不斷, 真心喜歡欲言又止。 一個想帶你深夜喝酒 一個想帶你清晨喝粥...
    吳寶鋮閱讀 784評論 0 0
  • 人生,不是看到了才相信,而是相信了才看到, 相信是萬能的開始,唯有相信,才能產(chǎn)生力量。 沒有規(guī)劃的人生是拼圖——碎...

友情鏈接更多精彩內(nèi)容