complex复合分片:基于多个字段进行数据分片。
PS:当前案例根据区域和时间双维度进行分片。
yml
t_user_activity:
actualDataNodes: ds0.t_user_activity_south_$->{['2022_0103','2022_0406','2022_0709','2022_1012']},ds0.t_user_activity_north_$->{['2022_0103','2022_0406','2022_0709','2022_1012']}
tableStrategy:
#复合条件分片--》多字段分片,字段之间以逗号隔开,PS:不止两个字段,多个也可以
complex:
shardingColumns: area,create_date
algorithmClassName: com.example.skywalkingtest.config.sharding.AreaAndMonthComplexKeysShardingAlgorithm
自定义算法:
import cn.hutool.core.collection.CollectionUtil;
import com.example.skywalkingtest.utils.DateUtils;
import com.google.common.collect.Range;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
import java.util.*;
/**
* 4.1version 复合分片
*/
@Slf4j
public class AreaAndMonthComplexKeysShardingAlgorithm implements ComplexKeysShardingAlgorithm<String> {
static String tableNamePre = "t_user_activity_";
static Map<String, List<String>>areaMap;
static Map<String, List<String>>monthMap;
static {
areaMap = new HashMap<String, List<String>>(){
{
put("north",new LinkedList<String>(){
{add("天津");add("北京");add("西安");add("咸阳");}});
put("south",new LinkedList<String>(){
{add("苏州");add("南京");add("上海");add("杭州");}});
}};
monthMap = new HashMap<String,List<String>>(){
{
put("2022_0103",new LinkedList<String>(){
{add("2022_01");add("2022_02");add("2022_03");}});
put("2022_0406",new LinkedList<String>(){
{add("2022_04");add("2022_05");add("2022_06");}});
put("2022_0709",new LinkedList<String>(){
{add("2022_07");add("2022_08");add("2022_09");}});
put("2022_10