首页 > 其他分享 >sharding分表应用笔记(二)——按时间分表策略配置

sharding分表应用笔记(二)——按时间分表策略配置

时间:2023-11-09 20:35:16浏览次数:31  
标签:logicTableName lowerDate 笔记 sharding ShardingUtils 分片 分表 String

sharding分表应用笔记(二)——按时间分表策略配置

目录

1 背景

应用背景:物理数据源只有一个;对于部分数据量大的表实行按月分表处理,其他的表仍然保持原先的模式不变。本篇记录sharding分表的时间分表策略配置。

环境:spring

2 配置

2.1 命名空间配置

<!-- 分表策略定义 -->
<bean id="datePreciseShardingAlgorithm" class="com.example.shardingDatePreciseShardingAlgorithm"></bean>
<bean id="dateRangeShardingAlgorithm" class="com.example.shardingDateRangeShardingAlgorithm"></bean>
<!-- 具体策略配置 -->
<sharding:standard-strategy id="byCreateTimeTableStrategy" sharding-column="create_time"precise-algorithm-ref="datePreciseShardingAlgorithm"range-algorithm-ref="dateRangeShardingAlgorithm"/>

(?)代表可缺省

<sharding:standard-strategy />

名称 类型 说明
id 属性 Spring Bean Id
sharding-column 属性 分片列名称
precise-algorithm-ref 属性 精确分片算法引用,用于=和IN。该类需实现PreciseShardingAlgorithm接口
range-algorithm-ref (?) 属性 范围分片算法引用,用于BETWEEN。该类需实现RangeShardingAlgorithm接口

其他未涉及的配置项请参考官方文档

2.2 策略接口实现

2.2.1 时间精确分片策略

/**
 * @author nagiumi
 * @date 2023/6/6
 * @description 精确分表算法
 */
public class DatePreciseShardingAlgorithm implements PreciseShardingAlgorithm<Date> {

    private static final Logger logger = LoggerFactory.getLogger(DatePreciseShardingAlgorithm.class);

    @Override
    public String doSharding(Collection<String> tableNames, PreciseShardingValue<Date> shardingValue) {
        Date date = shardingValue.getValue();
        String logicTableName = shardingValue.getLogicTableName();
        //ShardingUtils是一个自己创建的工具类,其中TABLE_SHARDING_START_TIME用于记录分表业务启动日期,用于实现原始表格的兼容
        if(ShardingUtils.TABLE_SHARDING_START_TIME.containsKey(logicTableName)) {
            // 查询时间在分表时间之前返回原表
            Date tableShardingStartTime = ShardingUtils.TABLE_SHARDING_START_TIME.get(logicTableName);
            if(date.before(tableShardingStartTime)) {
                return logicTableName;
            }
        }

        String suffix = "";
        try {
            //ShardingUtils是一个自己创建的工具类,其中getSuffixByYearMonth用于切分查询条件的年月信息,以确定合适的表节点
            suffix = ShardingUtils.getSuffixByYearMonth(date);
        } catch (Exception e) {
            logger.error("日期格式化异常,", e);
        }

        for (String key : tableNames) {
            if (key.endsWith(suffix)) {
                return key;
            }
        }
        throw new UnsupportedOperationException("不支持的分表字段");
    }
}

2.2.2 时间范围分片策略

/**
 * @author nagiumi
 * @date 2023/6/6
 * @description 范围分表算法
 */
public class DateRangeShardingAlgorithm implements RangeShardingAlgorithm<Date> {
    private final static Logger logger = LoggerFactory.getLogger(DateRangeShardingAlgorithm.class);

    @Override
    public Collection<String> doSharding(Collection availableTargetNames, RangeShardingValue rangeShardingValue) {
        List<String> list = new ArrayList<>();
        Range<Date> valueRange = rangeShardingValue.getValueRange();
        //必须有上下边界,便于确认分表节点,如果没有左边界则使用业务起始日期作为左边界;如果没有右边界以当前日期作为右边界
        Date lowerDate;
        try {
            lowerDate = valueRange.lowerEndpoint();
        } catch (IllegalStateException e) {
            lowerDate = DateUtil.getDate("2023-05-10");
            logger.error("日期格式化异常,", e);
        }

        Date upperDate = null;
        try {
            upperDate = valueRange.upperEndpoint();
        } catch (IllegalStateException e) {
            logger.error("日期格式化异常,", e);
        }
        if(Objects.isNull(upperDate)) {
            upperDate = new Date();
        }

        String logicTableName = rangeShardingValue.getLogicTableName();
        //ShardingUtils是一个自己创建的工具类,其中TABLE_SHARDING_START_TIME用于记录分表业务启动日期,用于实现原始表格的兼容
        if(ShardingUtils.TABLE_SHARDING_START_TIME.containsKey(logicTableName)) {
            // 查询时间在分表时间之前返回原表
            Date tableShardingStartTime = ShardingUtils.TABLE_SHARDING_START_TIME.get(logicTableName);
            if(lowerDate.before(tableShardingStartTime)) {
                list.add(logicTableName);
                lowerDate = tableShardingStartTime;
            }
        }

        //ShardingUtils是一个自己创建的工具类,其中getSuffixListForRange用于切分查询条件的年月信息(一个集合),以确定合适的表节点区间
        TreeSet<String> suffixSet = ShardingUtils.getSuffixListForRange(lowerDate, upperDate);
        for (String suffix : suffixSet) {
            String targetTableName = logicTableName + suffix;
            list.add(targetTableName);
        }
        return list;
    }
}

3 外部链接

ShardingSphere-4.1.1中文说明文档:https://shardingsphere.apache.org/document/4.1.1/cn/overview/

标签:logicTableName,lowerDate,笔记,sharding,ShardingUtils,分片,分表,String
From: https://www.cnblogs.com/nagiumi-misaka/p/17822734.html

相关文章

  • 【python进阶】14大模块200页知识体系md笔记,第5篇:python下的linux命令使用
    本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。全套Python笔记直接地址:请移步这里共......
  • 【学习笔记】树的直径
    树的直径定义为树上任意两点间最长的简单路径求法1:两次dfs适用范围:树上所有边边权都非负算法过程:以树上任意一点开始第一次dfs,找到距其最远的点\(z\),再以\(z\)为起始点进行第二次dfs,找到距其最远的点\(z\prime\),则\(zz\prime\)即为所求。......
  • 11/9训练笔记
    P5239回忆京都题解组合数递推公式递推出前1000*1000项组合数。预处理一下前缀和。\(O(1)\)回答。代码:#include<iostream>#defineintlonglongusingnamespacestd;intC[1010][1010],s[1010][1010],q,n,m;signedmain(){ for(inti=1;i<=1000;i++){ C[i][i]......
  • 二分图笔记
    一些定理一、最小点覆盖=最大匹配即,选一些点染色,要求图中所有边至少有一端被染色。证明:涂色方案:设匹配点为红点,未匹配点为蓝点。易知,一对匹配的红点,最多只有一个点会连接蓝点。将这个连接了蓝点的点染色。合法性:所有匹配边显然已经合法了,考虑非匹配边。非匹配边有一个性质:它......
  • 《信息安全系统设计与实现》第十周学习笔记
    第六章信号和信号处理信号和中断“中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理。与发送给CPU的中断请求一样,“信号”是发送给进程的请求,将进程从正常执行转移到中断处理。进程:一个“进程”就是一系列活动广义的“进程”包括:从事日常......
  • 软件工程导论笔记
    软件工程软件工程软件工程学概论软件危机的介绍(填空)软件危机的典型表现(填空)软件开发的三个时期(填空)软件开发的每个阶段的基本任务(填空)软件工程方法学的三要素软件过程(注意标题与项目对应)瀑布流模型快速原型模型增量模型螺旋模型喷泉模型Rational统一过程敏捷过程与极限编程微软......
  • 拓扑学 复习笔记 & 题目整理
    非常好友链,爱来自害羞:https://bluenine9.github.io/2023/09/21/拓扑学笔记/复习笔记懒得tex化了,我猜大家应该看得懂我的字^^......
  • 信息安全系统设计与实现 学习笔记9
    信号和信号处理信号和中断的统一处理“中断”是从I/O设备或协处理器发送CPU的外部请求,它将CPU从正常执行转移到中断处理(1)一个“进程”就是一些列活动(2)“中断”信号进程中断信号的来源硬件信号异常信号其他进程信号信号在Unix/Linux中的常见用法Unix/Linux中的信号处......
  • 2023年11月9号数学总结和笔记
    微积分的主要研究:事物运动中的数量的变化规律微积分分为两大类微分学(导数)积分学(积分)主要研究两种变化均匀变化(用初等数学可以解决)非均匀变化(用高等数学来解决)还有两个侧面宏观(局部,微分学,用来研究事物在某一时刻的变化率)微观(整体,积分学,用来研究......
  • 高级数据结构学习笔记
    0.普适技巧动态开点:节省空间。标记永久化:分块的块标记本质就是这个。可以节省空间。1.区间最值&历史区间最值link2.二维线段树二维区间静态:二维ST表二维前缀动态:二维树状数组二维区间动态:二维线段树例题:LuckandLove、P3157[CQOI2011]动态逆序......