当前位置:   article > 正文

sharding-jdbc分片策略

tableshardingalgorithm

一、在上一节中提到了分库分表的策略。分库策略算法GroupIDAndCollectTimeDBShardingAlgorithm和分表策略算法CollectTimeYYYYMMDDTBShardingAlgorithm

     分片策略算法有很多,但是一般的都是需要自定义,dangdangwang提供了最顶层的实现,但是具体的算法需要我们自己来写。

     这里有两个自定义的算法,单分片算法和多分片算法,单分片算法是多分片算法的一种简单形式,所以完全可以用多分片算法代替单分片算法,下面两种形式是等价的。

newTableShardingStrategy("order_id",newSingleKeyShardingAlgorithm()))newTableShardingStrategy(Arrays.asList("order_id"),newMultiKeyShardingAlgorithm()))

同时在算法内部,dosharding等方法的shardingvalue入参根据使用算法类型不同而不同,单分片算法方public String doEqualSharding(final Collection<String> dataSourceNames,final ShardingValue<Integer> shardingValue)

多分片算法public Collection<String>doSharding(final Collection<String> availableTargetNames,final Collection<ShardingValue<?>> shardingValues)

根据数据源策略和表策略,单分片与多分片,这两种组合一共产生了4中可供实现的分片算法的接

  • 单分片键数据源分片算法SingleKeyDatabaseShardingAlgorithm
  • 单分片表分片算法SingleKeyTableShardingAlgorithm
  • 多分片键数据源分片算法MultipleKeyDatabaseShardingAlgorithm
  • 多分片表分片算法MultipleKeyTableShardingAlgorithm

 单分片建算法需要实现三个方法,下面以单分片建数据源分片算法举例:

@Override public String doEqualSharding(final Collection<String> availableTargetNames,final ShardingValue<Integer> shardingValue) @Override public Collection<String>doInSharding(final Collection<String> availableTargetNames,final ShardingValue<Integer> shardingValue) @Override public Collection<String>doBetweenSharding(final Collection<String> availableTargetNames,final ShardingValue<Integer> shardingValue)

 这三种算法作用如下 - doEqualSharding在WHERE使用=作为条件分片键。算法中使用shardingValue.getValue()获取等=后的值 -doInSharding在WHERE使用IN作为条件分片键。算法中使用shardingValue.getValues()获取IN后的值 - doBetweenSharding在WHERE使用BETWEEN作为条件分片键。算法中使用shardingValue.getValueRange()获取BETWEEN后的值

 多分片建算法适用于比较复杂的场景,为了提高灵活性故只提供了一个方法实现

public Collection<String>doSharding(final Collection<String> availableTargetNames,final Collection<ShardingValue<?>> shardingValues)

算法实现的时候根据shardingValue.getType来获取条件是= .IN还是between

举个例:

db0 ├── t_order_00 user_id以a偶数 order_id为偶数 ├── t_order_01 user_id以a偶数 order_id为奇数 ├── t_order_10 user_id以b奇数 order_id为偶数 └── t_order_11 user_id以b奇数 order_id为奇数

 

  1. public final class MultipleKeysModuloTableShardingAlgorithm implements MultipleKeysTableShardingAlgorithm {
  2. @Override
  3. public Collection<String> doSharding(final Collection<String> availableTargetNames, final Collection<ShardingValue<?>> shardingValues) {
  4. Set<Integer> orderIdValueSet = getShardingValue(shardingValues, "order_id");
  5. Set<Integer> userIdValueSet = getShardingValue(shardingValues, "user_id");
  6. List<String> result = new ArrayList<>();
  7. /*
  8. userIdValueSet[10,11] + orderIdValueSet[101,102] => valueResult[[10,101],[10,102],[11,101],[11,102]]
  9. */
  10. Set<List<Integer>> valueResult = Sets.cartesianProduct(userIdValueSet, orderIdValueSet);
  11. for (List<Integer> value : valueResult) {
  12. String suffix = Joiner.on("").join(value.get(0) % 2, value.get(1) % 2);
  13. for (String tableName : availableTargetNames) {
  14. if (tableName.endsWith(suffix)) {
  15. result.add(tableName);
  16. }
  17. }
  18. }
  19. return result;
  20. }
  21. private Set<Integer> getShardingValue(final Collection<ShardingValue<?>> shardingValues, final String shardingKey) {
  22. Set<Integer> valueSet = new HashSet<>();
  23. ShardingValue<Integer> shardingValue = null;
  24. for (ShardingValue<?> each : shardingValues) {
  25. if (each.getColumnName().equals(shardingKey)) {
  26. shardingValue = (ShardingValue<Integer>) each;
  27. break;
  28. }
  29. }
  30. if (null == shardingValue) {
  31. return valueSet;
  32. }
  33. switch (shardingValue.getType()) {
  34. case SINGLE:
  35. valueSet.add(shardingValue.getValue());
  36. break;
  37. case LIST:
  38. valueSet.addAll(shardingValue.getValues());
  39. break;
  40. case RANGE:
  41. for (Integer i = shardingValue.getValueRange().lowerEndpoint(); i <= shardingValue.getValueRange().upperEndpoint(); i++) {
  42. valueSet.add(i);
  43. }
  44. break;
  45. default:
  46. throw new UnsupportedOperationException();
  47. }
  48. return valueSet;
  49. }
  50. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/756707
推荐阅读
相关标签
  

闽ICP备14008679号