`

策略模式----分表策略

阅读更多

Strategy模式的应用场景是:
1. 多个类的分别只是在于行为不同
2. 你需要对行为的算法做很多变动
3. 客户不知道算法要使用的数据

 

Strategy模式接口里声明的方法一般是公有的。

 

下面是示例代码:

/**
 * 分表策略
 */
public abstract class SubTableStrategy
{
    //动态表类型,表类型与精度相关,如果需要自定义精度,可以设置为自定义类型
    public static final int TYPE_CURRENT = 20;
    public static final int TYPE_MINUTE = 60;
    public static final int TYPE_5_MINUTE = 300;
    public static final int TYPE_HOUR = 3600;
    public static final int TYPE_DAY = 24*3600;
    public static final int TYPE_CUSTOM = -1;
   
    /**
     * 当前表策略
     */
    public static final CurrentStrategy current = new CurrentStrategy();
   
    /**
     * 分钟表
     */
    public static final MinuteStrategy minute = new MinuteStrategy();
   
    /**
     * 5分钟表
     */
    public static final FiveMinuteStrategy minute_5 = new FiveMinuteStrategy();

    /**
     * 小时表
     */
    public static final HourStrategy hour = new HourStrategy();
   
    /**
     * 天表
     */
    public static final DayStrategy day = new DayStrategy();
   
    /**
     * 获取表后缀名称
     * @return
     */
    public abstract String getSubTableSuffix(long time);
   
    /**
     * 获取下一张表后缀名称
     * @return
     */
    public abstract String getNextSubTableSuffix(long time);
   
    /**
     * 获取调度配置
     * @return
     */
    public abstract String getCornConf();
   
    /**
     * 获取分表类型,当前表,分钟表,小时表,天表,自定义表等
     * @return
     */
    public abstract int getSubTableType();
   
    /**
     * 精度,单位s
     * @return
     */
    public abstract int getSecondsAccuracy();
   
    /**
     * 获取表中存储数据的时间限制
     * 即当前表存储数据的时间宽度,单位s
     * @return
     */
    public abstract int getStorageLimitSeconds();
   
    /**
     * 获取在线保存时间,单位s
     */
    public abstract int getDataOnLineSeconds();
   
    /**
     * 获取归档时间
     * @return
     */
    public abstract int getPlaceOnFileSeconds();
}

 

策略实现类代码:

/**
 * 当前表策略
 */
public class CurrentStrategy extends SubTableStrategy
{
    private static final SimpleDateFormat dateFmt = new SimpleDateFormat("yyyyMMdd_HH_mm");
    
    @Override
    public String getSubTableSuffix(long time)
    {
        return "_current_"+dateFmt.format(new Date(time-(time%(getStorageLimitSeconds()*1000))));
    }
    
    /**
     * 获取下一张表后缀名称
     * @return
     */
    public String getNextSubTableSuffix(long time)
    {
        return "_current_"+dateFmt.format(new Date(time-(time%(getStorageLimitSeconds()*1000))+getStorageLimitSeconds()*1000));
    }
    
    /**
     * 获取调度配置
     * @return
     */
    public String getCornConf()
    {
        return null;
    }

    @Override
    public int getSubTableType()
    {
        return SubTableStrategy.TYPE_CURRENT;
    }

    @Override
    public int getSecondsAccuracy()
    {
        return ApmFlowEngine.analyseCycle;
    }

    /**
     * 仅存储5分钟的数据
     */
    @Override
    public int getStorageLimitSeconds()
    {
        return 5*60;
    }
    
    /**
     * 数据在线时间为1小时
     */
    @Override
    public int getDataOnLineSeconds()
    {
        return 60*60;
    }

    /**
     * 数据归档时间为3天
     */
    @Override
    public int getPlaceOnFileSeconds()
    {
        return 3*24*60*60;
    }       
}

 

/**
 * 分钟表策略
 */
public class MinuteStrategy extends SubTableStrategy
{
    private static final SimpleDateFormat dateFmt = new SimpleDateFormat("yyyyMMdd_HH");
   
    @Override
    public String getSubTableSuffix(long time)
    {
        return "_minute_"+dateFmt.format(new Date(time-(time%(getStorageLimitSeconds()*1000))));
    }
   
    /**
     * 获取下一张表后缀名称
     * @return
     */
    public String getNextSubTableSuffix(long time)
    {
        return "_minute_"+dateFmt.format(new Date(time-(time%(getStorageLimitSeconds()*1000))+getStorageLimitSeconds()*1000));
    }
   
    /**
     * 获取调度配置
     * @return
     */
    public String getCornConf()
    {
        return "0 0/1 * * * ?";
    }

    @Override
    public int getSubTableType()
    {
        return SubTableStrategy.TYPE_MINUTE;
    }

    @Override
    public int getSecondsAccuracy()
    {
        return 60;
    }

    /**
     * 仅存储1小时的数据
     */
    @Override
    public int getStorageLimitSeconds()
    {
        return 60*60;
    }
   
    /**
     * 数据在线时间为31天
     */
    @Override
    public int getDataOnLineSeconds()
    {
        return 31*24*60*60;
    }

    /**
     * 数据归档时间为3个月
     */
    @Override
    public int getPlaceOnFileSeconds()
    {
        return 3*31*24*60*60;
    }       
}

 

剩余的代码就不贴出来了,您可以自己写实现,主要是接口的方法是public,方便在不同的场景下使用不同的分表策略。

 

分享到:
评论

相关推荐

    springmvc +mybatis采用策略设计模式基于拦截器实现按年分表

    在本项目中,策略模式可能被用来动态选择不同的分表策略。例如,系统可以根据年份将数据分散在多个表中,每个表对应一年的数据,这样可以有效缓解单表压力,提高查询效率。 4. **拦截器**: 在SpringMVC中,拦截器...

    mysql分库分表-mysql-sharding-jdbc.zip

    MySQL 分库分表是一种数据库扩展策略,用于解决大数据量下的性能瓶颈问题。在单个数据库无法满足高并发、大数据处理...通过合理的分库分表策略和 Sharding-JDBC 框架的使用,可以有效地提高系统的扩展性和处理能力。

    4-Sharding-JDBC分库分表.pdf

    分库分表是为了解决随着业务数据量的不断增长,单库单表模式面临的性能瓶颈和可维护性差的问题。通过将数据分散存储到多个数据库或多个表中,从而达到降低单库单表的压力,提高查询效率和系统性能的目的。 ### 垂直...

    sharding-sphere-demo 分表分库

    Sharding-Sphere的分库分表策略主要基于数据路由。它根据预先定义的分片规则,将SQL语句路由到相应的数据库和表上执行。分片规则通常包括基于范围的分片、基于哈希值的分片、复合分片等。例如,可以根据用户ID的哈希...

    sharding-jdbc按月分表样例

    分片策略可能基于时间字段,并且需要指定每个月的表名模式。 3. **数据库脚本**:创建分表的SQL脚本,这些脚本将创建基础表结构,每个表对应一个月的数据。 4. **测试用例**:可能会有JUnit测试类,用来验证分片...

    mysql读写分离,分库分表-MysqlSample.zip

    分表策略的选择应兼顾数据分布的均匀性和查询效率。 3. 分片键(Sharding Key):用于确定数据在哪个分片上的字段,通常选择业务上具有均匀分布特性的字段作为分片键。 4. 分片路由:当客户端发起SQL查询时,需要...

    集成sharding-jdbc实现分库分表.zip

    在IT行业中,数据库扩展是解决高并发、大数据量问题的关键技术之一。Sharding-JDBC作为阿里巴巴开源的一款轻量级...在实际操作中,我们需要结合业务场景和数据库特性,合理地设计分片策略,以实现最佳的分库分表效果。

    MySQL分库分表演示-sharding-jdbc-demo.zip

    为了解决这一问题,业界提出了分库分表的策略,将一个大型数据库拆分为多个小型数据库,每个数据库处理一部分数据,从而提高系统的并行处理能力和响应速度。Sharding-JDBC是阿里巴巴开源的轻量级Java框架,用于实现...

    MySQL分库分表-sharding_demo.zip

    MySQL的分库分表是一种常见的数据库扩展策略,用于解决单个数据库系统在处理大量数据和高并发场景下性能瓶颈的问题。本示例"sharding_demo"将深入探讨如何实现这一策略,通过创建分布式数据库环境来提升系统的可扩展...

    原文件-分表储存.zip

    分表储存,即水平分区(Horizontal Partitioning),是数据库优化的一种策略,将一个大表分成多个小表,每个小表包含一部分数据。对于省市联动表,我们可以按照省份进行分区,每个省份的数据存储在一个单独的表中。...

    分库分表面试题- pdf

    ### 分库分表知识点详解 #### 一、为什么要使用分库分表? 随着互联网应用的快速发展,单一数据库的性能瓶颈逐渐显现,主要...因此,在实际应用中,应综合考虑业务需求和技术实现的可行性,合理选择分库分表策略。

    sharding-sphere 分库分表 (springboot + mybat-sharding-sphere.zip

    3. **分布式事务**:Sharding-Sphere支持分布式事务,包括X/Open XA、Seata AT模式、Saga长事务等多种事务模型,确保数据的一致性和完整性。 4. **数据库治理**:提供数据库连接池管理、SQL监控、故障切换等服务,...

    springmvc分库分表实际例子

    在IT行业中,数据库扩展是解决高并发、大数据量场景下的常见策略,而“分库分表”正是其中一种有效的手段。本示例“springmvc分库分表实际例子”提供了一个基于SpringMVC实现的实战项目,旨在帮助开发者了解如何在...

    Mybaits-plus优雅的实现多数据源及分表

    本文将深入探讨如何使用MyBatis-Plus优雅地实现多数据源及分表策略,为系统的高效运行提供支持。 首先,多数据源是指在一个应用中同时连接并操作多个不同的数据库,这种设计模式常用于分布式系统或高可用架构中,以...

    springMvc Mybatis mysql 分库分表-shardingJdbc.zip

    1. ShardingRule:定义分库分表的策略,如按照用户ID模10进行分表。 2. 数据源配置:定义了连接不同数据库的数据源,例如ds_0、ds_1表示两个数据库实例。 3. SQL路由:根据ShardingRule解析SQL语句,确定实际执行的...

    数据库技术与应用专场——02_58同城mysql分库分表实践-沈剑

    ### 数据库技术与应用专场——58同城MySQL分库分表实践 ...通过上述实践案例和技术方案,我们可以看到,在面对大数据量的情况下,通过合理的数据库设计和有效的分库分表策略,可以显著提高系统的性能和可扩展性。

    incubator-shardingsphere-example-dev_currenthfw_分库分表_源码

    在本示例项目"incubator-shardingsphere-example-dev_currenthfw_分库分表_源码"中,我们将深入探讨如何利用ShardingSphere实现分库分表的策略,并通过实际案例来理解其工作原理和应用场景。 一、分库分表概念 分...

    shardingsphere 分库分表中文帮助文档

    - 需要在不同的模块之间采用不同的分库分表策略。 - 对于旧系统改造,部分模块使用 Shardingsphere-JDBC,新开发的部分使用 Shardingsphere-Proxy。 #### 2. 快速入门 ##### 2.1 Shardingsphere-JDBC **步骤 1...

    Mysql分表查询,哈希,范围,列表

    MySQL提供了多种分表策略,如哈希分表、范围分表和列表分表,这些方法可以帮助我们有效地管理和优化数据库性能。 ### 1. 哈希分表 哈希分表是通过计算数据的哈希值来决定数据应存储在哪个子表中,以此达到均匀分布...

    spring动态数据源+mybatis分库分表

    3. **分库分表策略**:常见的分库分表策略有哈希分片、范围分片、时间戳分片等。哈希分片通过计算对象的哈希值决定其存储位置,保证了数据均匀分布;范围分片则根据某个字段的范围(如用户ID的连续区间)进行分片;...

Global site tag (gtag.js) - Google Analytics