Java高频面试-如何配置ShardingSphere的数据分片策略?

【分库分表】ShardingSphere分库分表实战--inline策略 参考 【分库分表】sharding-jdbc—分片策略 Sharding JDBC(四) 分片策略一:标准分片策略StandardShardingStrategy 阅读详情

引言

“ShardingSphere你用过,那你讲讲它有哪些分片策略?各自在什么场景下使用?”

这是很多Java面试中必然会遇到的一道高频题。很多开发者能说出inline、standard这些名词,但当面试官追问“inline表达式里${user_id % 8}和ds${user_id % 2}.order_${order_id % 16}这两种配置有什么区别?”“复合分片策略什么时候用?”时,就开始支支吾吾了。

分片策略的配置是ShardingSphere落地的第一步,也是区分“用过”和“真正掌握”的分水岭。本文将从面试高频考点出发,结合电商订单系统的实战案例,手把手带你掌握ShardingSphere-JDBC五种分片策略的完整配置方式,并提供可以直接复制使用的配置模板。

一、分片策略的本质:分片键 + 分片算法

在深入配置之前,先建立正确的认知模型。

ShardingSphere的分片策略由两部分组成:分片键和分片算法。分片键决定依据哪个字段拆分,分片算法决定按什么规则计算目标分片。

核心公式:

分片策略 = 分片键 + 分片算法

ShardingSphere对外提供了五种分片策略:standard、complex、hint、inline、none。不同的分片策略搭配不同的分片算法,灵活应对复杂业务场景。

二、环境准备与依赖配置

2.1 Maven依赖

这是最容易踩坑的一步。很多开发者引入ShardingSphere-JDBC的Spring Boot Starter后,项目启动就会报ClassNotFoundException或NoSuchMethodError,往往是因为snakeyaml版本冲突。

推荐使用以下依赖配置(基于ShardingSphere-JDBC 5.3.2),特别注意exclusions部分:

<dependencies>
    <!-- ShardingSphere JDBC核心依赖 -->
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
        <version>5.3.2</version>
        <exclusions>
            <exclusion>
                <groupId>org.yaml</groupId>
                <artifactId>snakeyaml</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 显式指定snakeyaml版本,避免冲突 -->
    <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>2.0</version>
    </dependency>
    <!-- MyBatis-Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version>
    </dependency>
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
</dependencies>

2.2 数据源配置

spring:
  shardingsphere:
    datasource:
      names: ds0, ds1
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db_order_0
        username: root
        password: 123456
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db_order_1
        username: root
        password: 123456

三、五种分片策略详解与实战

3.1 Inline策略:最常用,轻量级表达式

适用场景:分片规则简单,单一分片键,仅支持=和IN操作符的场景。这是入门分库分表的首选策略。

核心配置:通过Groovy表达式直接定义分片逻辑,无需编写Java代码。

库分片配置示例(按用户ID取模):

spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order
            database-strategy:
              inline:
                sharding-column: user_id
                algorithm-expression: ds${user_id % 2}

库+表复合分片示例(用户ID分库 + 订单ID分表):

spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order_$->{0..15}
            database-strategy:
              inline:
                sharding-column: user_id
                algorithm-expression: ds${user_id % 2}
            table-strategy:
              inline:
                sharding-column: order_id
                algorithm-expression: t_order_${order_id % 16}

⚠️ 踩坑警告:

  1. 不支持范围查询:Inline策略仅支持=和IN操作符。如果SQL中包含BETWEEN AND、>、<等范围条件,ShardingSphere会忽略分片策略,进行全库表路由,性能急剧下降。

  2. 分片键不能为NULL:NULL值无法参与数学运算(如取余),ShardingSphere无法决定数据放在哪个分片,导致分片失败。必须在应用层确保分片键非空。

  3. 数据倾斜风险:如果分片键分布不均(如新注册用户ID集中在某些区间),取模后可能导致部分分片数据量远超其他分片。

3.2 Standard策略:支持范围查询的标准分片

适用场景:单一分片键,但SQL中包含BETWEEN AND、>、<等范围操作符的场景。

Standard策略支持精确分片和范围分片两种模式。需要实现StandardShardingAlgorithm接口,包含两个方法:

  • 精确分片:处理=和IN操作符

  • 范围分片:处理BETWEEN AND、>、<等范围操作符

自定义算法实现:

public class OrderStandardShardingAlgorithm implements StandardShardingAlgorithm<Long> {
    
    private Properties props = new Properties();
    
    @Override
    public String doSharding(Collection<String> availableTargetNames, 
                             PreciseShardingValue<Long> shardingValue) {
        // 精确分片:处理 = 和 IN
        Long orderId = shardingValue.getValue();
        String suffix = String.valueOf(orderId % 16);
        return "t_order_" + suffix;
    }
    
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames,
                                          RangeShardingValue<Long> shardingValue) {
        // 范围分片:处理 BETWEEN AND
        Set<String> result = new LinkedHashSet<>();
        Range<Long> valueRange = shardingValue.getValueRange();
        Long lower = valueRange.lowerEndpoint();
        Long upper = valueRange.upperEndpoint();
        
        // 计算需要查询的分片范围
        for (Long i = lower; i <= upper; i++) {
            String suffix = String.valueOf(i % 16);
            result.add("t_order_" + suffix);
        }
        return result;
    }
    
    @Override
    public Properties getProps() {
        return props;
    }
    
    @Override
    public void init(Properties props) {
        this.props = props;
    }
}

YAML配置:

spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order_$->{0..15}
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: order-standard
        sharding-algorithms:
          order-standard:
            type: CLASS_BASED
            props:
              strategy: STANDARD
              algorithmClassName: com.example.OrderStandardShardingAlgorithm

面试加分点:面试官问“Standard策略和Inline策略有什么区别”时,不仅要说出范围查询的支持差异,还要点出实现上的区别——Standard需要自定义算法类,更灵活但代码量更大;Inline配置简单但不支持范围查询。

3.3 Complex策略:多分片键复合分片

适用场景:需要根据多个字段共同决定分片路由的场景,如user_id和order_type复合路由。

自定义算法实现:

public class OrderComplexShardingAlgorithm implements ComplexKeysShardingAlgorithm<Long> {
    
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames,
                                          ComplexKeysShardingValue<Long> shardingValue) {
        // 获取多个分片键的值
        Map<String, Collection<Long>> columnNameAndShardingValuesMap = 
            shardingValue.getColumnNameAndShardingValuesMap();
        
        Collection<Long> userIds = columnNameAndShardingValuesMap.get("user_id");
        Collection<Long> orderTypes = columnNameAndShardingValuesMap.get("order_type");
        
        Set<String> result = new LinkedHashSet<>();
        for (Long userId : userIds) {
            for (Long orderType : orderTypes) {
                // 复合路由逻辑:库 = user_id % 2,表 = order_type
                String db = "ds" + (userId % 2);
                String table = "t_order_" + orderType;
                result.add(db + "." + table);
            }
        }
        return result;
    }
}

YAML配置:

spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order_$->{0..3}
            database-strategy:
              complex:
                sharding-columns: user_id, order_type
                sharding-algorithm-name: order-complex
        sharding-algorithms:
          order-complex:
            type: CLASS_BASED
            props:
              strategy: COMPLEX
              algorithmClassName: com.example.OrderComplexShardingAlgorithm

⚠️ 注意:Complex策略的性能开销高于单一分片键策略。在多分片键场景下,需要评估是否真的需要复合分片,很多时候可以通过设计单分片键+二级索引来替代。

3.4 Hint策略:强制路由

适用场景:SQL中不包含分片键字段,但又需要精准路由到特定分片的场景。最典型的例子是表结构中没有分片键字段,但业务逻辑要求按某个维度路由。

Hint策略无需从SQL中解析分片键,分片键值由外部指定。

自定义算法实现:

public class OrderHintShardingAlgorithm implements HintShardingAlgorithm<Long> {
    
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames,
                                          HintShardingValue<Long> shardingValue) {
        Collection<Long> values = shardingValue.getValues();
        Set<String> result = new LinkedHashSet<>();
        for (Long value : values) {
            String db = "ds" + (value % 2);
            String table = "t_order_" + (value % 16);
            result.add(db + "." + table);
        }
        return result;
    }
}

业务代码中指定分片信息:

@Service
public class OrderService {
    
    public void queryOrderWithHint(Long userId) {
        // 通过HintManager指定分片路由
        try (HintManager hintManager = HintManager.getInstance()) {
            // 指定数据库分片
            hintManager.addDatabaseShardingValue("t_order", userId);
            // 指定表分片
            hintManager.addTableShardingValue("t_order", userId);
            
            // 执行SQL时,会强制路由到Hint指定的分片
            orderMapper.selectOrders();
        }
    }
}

YAML配置:

spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order_$->{0..15}
            database-strategy:
              hint:
                sharding-algorithm-name: order-hint
        sharding-algorithms:
          order-hint:
            type: CLASS_BASED
            props:
              strategy: HINT
              algorithmClassName: com.example.OrderHintShardingAlgorithm

⚠️ 关键提醒:使用完HintManager后,必须调用close()方法或使用try-with-resources释放资源,否则会影响后续SQL的路由。

3.5 None策略:不分片

适用场景:某些表不需要分片,但与其他分片表存在关联查询的场景。最常见的是将小表设置为广播表,每个分片库中都有完整副本,避免跨库JOIN。

spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          t_dict:
            actual-data-nodes: ds$->{0..1}.t_dict
            database-strategy:
              none:  # 不分片策略

四、绑定表与广播表:关联查询的优化利器

4.1 绑定表:解决大表与大表的关联问题

当订单表和订单明细表都按user_id分片,且分片规则完全一致时,可以通过绑定表让ShardingSphere将关联查询路由到同一分片内执行,避免笛卡尔积查询。

配置方式:

spring:
  shardingsphere:
    rules:
      sharding:
        binding-tables:
          - t_order, t_order_item

面试加分点:面试官问“绑定表如何提升查询性能”时,回答核心在于避免跨分片笛卡尔积。没有绑定时,两张分片表关联查询会产生M×N次查询;绑定了同一分片键后,只会产生max(M,N)次查询,性能提升量级巨大。

4.2 广播表:解决小表与大表的关联问题

像字典表、配置表这类数据量小但需要与所有分片表频繁关联查询的表,应该设置为广播表。每个分片库中都有该表的完整副本,关联查询时直接在本地完成,高效又简单。

配置方式:

spring:
  shardingsphere:
    rules:
      sharding:
        broadcast-tables:
          - t_dict

⚠️ 踩坑警告:广播表适合数据量小、更新频率低的场景。如果把一张每天更新上万次的表设为广播表,每次DML操作都会在所有分片上执行,写放大效应会带来巨大的性能开销。

五、分布式ID生成策略

分库分表后,数据库自增ID无法保证全局唯一。ShardingSphere内置了多种分布式主键生成算法。

5.1 雪花算法配置

雪花算法生成的ID是64位长整型,由时间戳、工作机器ID和序列号组成,趋势递增,对数据库索引友好。

spring:
  shardingsphere:
    rules:
      sharding:
        tables:
          t_order:
            key-generate-strategy:
              column: order_id
              key-generator-name: snowflake
        key-generators:
          snowflake:
            type: SNOWFLAKE
            props:
              worker-id: 1  # 工作机器ID,不同节点配置不同

5.2 自定义ID生成器

如果内置策略不满足需求(如需要在ID中注入分片键信息实现基因法),可以通过实现KeyGenerateAlgorithm接口自定义:

public class CustomKeyGenerateAlgorithm implements KeyGenerateAlgorithm {
    
    private Properties props = new Properties();
    
    @Override
    public Comparable<?> generateKey() {
        // 自定义ID生成逻辑,例如:时间戳 + 机器ID + 序列号 + 用户ID后4位(基因)
        return null;
    }
    
    @Override
    public Properties getProps() {
        return props;
    }
    
    @Override
    public void init(Properties props) {
        this.props = props;
    }
}

六、五种策略速查对比表

策略分片键数量支持范围查询是否需要编码典型场景
Inline单个❌ 不支持否简单取模分片,入门首选
Standard单个✅ 支持是需要范围查询的单一分片键场景
Complex多个✅ 支持是多字段复合路由,如用户+类型
Hint无限制✅ 支持是SQL中无分片键,需强制指定分片
None无-否不分片的小表(广播表)

七、面试常见追问与加分表述

Q1:Inline策略不支持范围查询,那项目中遇到范围查询需求怎么办?

加分表述:这是个很好的问题。Inline策略确实只支持等值查询,范围查询时会退化为全库表路由,性能极差。我在项目中有三种应对策略:

第一,将范围查询拆分到代码层完成,先确定分片键值的范围,再对每个值分别查询,最后合并结果。比如查询order_id BETWEEN 1000 AND 2000,可以先计算出1000~2000范围内所有order_id,再对每个id执行单点查询。

第二,对于时间范围的场景,可以配合时间维度的分表策略,通过Standard策略实现精准的范围路由。

第三,也是最推荐的方案,将范围查询类业务卸载到ES宽表,主数据库只承担等值查询,这从根本上避免了范围查询的性能问题。

Q2:Composite策略和Standard策略都可以实现多分片键,有什么区别?

加分表述:这两种策略的设计理念完全不同。Standard策略的核心是“单分片键+多种算法”,它只处理一个分片键,但可以同时支持精确分片和范围分片两种算法。而Complex策略的核心是“多分片键+单一算法”,它处理多个分片键,但只运行一个复合算法。

实用建议:能用Standard解决的场景尽量不要用Complex。Complex策略需要遍历多个分片键的组合,性能开销更大。很多场景下,通过设计单分片键配合基因法(在ID中注入另一个维度的信息),就可以避免使用Complex策略。

Q3:分片键为NULL时,如何保证分片策略不崩溃?

加分表述:ShardingSphere的Inline策略对NULL值的处理确实比较脆弱,NULL值无法参与数学运算,会直接导致分片失败。我的处理思路分为三个层面:

应用层:在插入数据前校验分片键,若为空则赋予默认值或直接拒绝请求。

数据库层:设置分片键字段为NOT NULL,从数据库层面杜绝NULL值。

兜底方案:如果业务确实存在分片键为空但必须落地的场景,可以使用Hint策略绕过分片键解析,在代码中手动指定路由目标。

Q4:你们是如何选择分片策略的?

加分表述:选择分片策略有一个清晰的决策链:

第一步,看是否需要分片。如果是字典表、配置表等小表,直接使用None策略配合广播表。

第二步,看分片键数量。单分片键优先考虑Inline,配置简单、性能好。如果确实需要范围查询,才考虑Standard。

第三步,看是否有多分片键需求。原则上尽量避免,但如果业务必须,使用Complex。同时,在分片键中通过基因法嵌入辅助查询维度,减少对复合分片的依赖。

第四步,考虑特殊场景。如果SQL中不包含分片键,使用Hint策略强制路由。

八、总结

配置ShardingSphere的数据分片策略,本质上是在回答三个问题:用什么字段分片?用什么规则计算?特殊场景如何兜底?

  • Inline:简单粗暴,入门首选,但不支持范围查询

  • Standard:支持范围查询,需要编码,单分片键场景的终极方案

  • Complex:多分片键复合路由,性能开销大,谨慎使用

  • Hint:需要手动管理生命周期

  • None:小表的归宿,配合广播表使用

掌握了这五种策略的适用场景和配置方式,你不仅能在面试中从容应对追问,更能在实际项目中做出正确的技术选型。分片策略配置是ShardingSphere落地的第一块基石,一块一块铺好,才能走得更远。

面试:ShardingSphere问题 ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,主要由 JDBC、Proxy 组成。这两个产品均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。ShardingSphere是一个功能强大的数据库中间件,可用于解决分布式数据库架构中的多种挑战,包括数据分片、读写分离、分布式事务、影子库、数据加密等,从而提高了系统的性能、扩展性和可用性。ShardingSphere 保留了非常多的功能扩展。 阅读详情

相关推荐

ShardingSphere分库分表教程,java后端开发面试题

???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录 一、分库分表 二、分库分表的方式 1、垂直分表 2、垂直分库 3、水平分表 4、水平分库 三、分库分表带来的问题 1、学习成本问题 2、事务问题 3、跨节点join问题 4、跨节点的count、order by、group by以及聚合函数问题 5、数据迁移、容量规划、扩

m0_64205716的博客 3015

ShardingSphere分库分表核心原理精讲第二节 应用集成和配置驱动

04 应用集成:在业务系统中使用 ShardingSphere 的方式有哪些? 在上一课时中,我详细介绍了 ShardingSphere 与 JDBC 规范之间的兼容性关系,我们知道 ShardingSphere 对 JDBC 规范进行了重写,并嵌入了分片机制。基于这种兼容性,开发人员使用 ShardingSphere 时就像在使用 JDBC 规范所暴露的各个接口一样。这一课时,我们将讨论如何在业务系统中使用 ShardingSphere 的具体方式。 如何抽象开源框架的应用方式? 当我们自己在设计和实现

fegus的博客 1680

Java后端面试7天冲刺:从HashMap到系统设计,构建实战知识体系

在Java后端开发领域,掌握核心数据结构与算法是构建高性能应用的基础。以HashMap为例,其底层通过数组、链表与红黑树的组合实现高效的键值存储,其扩容机制、哈希冲突解决策略及线程安全考量,直接关系到应用在高并发场景下的性能与稳定性。理解这些原理,有助于开发者根据业务场景选择合适的集合实现,例如在缓存、分布式锁等实际应用中做出最优技术选型。本文聚焦HashMap、JVM、高并发等核心模块,通过原理剖析与场景设计,帮助读者构建从底层到实战的完整知识体系,应对深度技术面试。

weixin_34238633的博客 340

ShardingSphere介绍及inline分片算法

ShardingSphere是一款起源于当当网内部的应用框架,2015年在当当网内部诞生,2016年由主要开发人员张亮带入京东数科,在国内经历了当当网、电信翼支付、京东数科等多家大型互联网企业的考验,在2017年开源。 并逐渐由原本只关注于关系型数据库增强工具的ShardingJDBC升级成为一整套以数据分片为基础的数据生态圈,更名为ShardingSphere;在2020年4月,成为Apache软件基金会顶级项目。 ShardingSphere包含三个重...

David_bdqn的博客 3370

Excel药品说明书数据库:从零开始搭建医药数据查询系统(附完整模板)

本文详细介绍了如何从零开始搭建Excel药品说明书数据库,提供完整的医药数据查询系统模板。涵盖数据库架构设计、数据清洗标准化、智能查询系统搭建及维护优化,帮助医药从业者高效管理药品信息,提升查询速度和准确性。

weixin_28327051的博客 231

OpenClaw智能体应用第一集--飞书多智能体配置

本文介绍了智能体(Agent)的核心概念与配置实践。Agent作为独立作用域的"大脑",包含模型(认知引擎)、记忆系统(短期/长期记忆)、人设(角色定义)、工具(外部能力调用)、规划执行(任务拆解)、运行环境等核心要素。每个Agent拥有唯一agentId标识,通过accountId区分渠道账号,Binding机制实现消息路由。实践部分展示了通过命令行配置多个智能体(如writer)的过程,包括插件注册和工具加载。系统支持多Agent架构,可根据不同场景需求灵活配置专属智能体。

weixin_44626085的博客 1746

Java面试-分库分表的常见方案:ShardingSphere 实战

单表数据突破 5000 万,查询慢如蜗牛,加索引也没用……”当数据量达到千万级、亿级🔴性能瓶颈:查询、写入变慢🔴存储瓶颈:磁盘撑爆🔴高可用风险:单点故障分库分表(Sharding)就是将数据水平拆分✅ 水平扩展✅ 提升读写性能✅ 提高系统可用性今天,我们就来实战—— 分库分表的“终极武器”。准备好了吗?我们出发!🚀💥Apache 顶级项目分布式数据库中间件提供分库分表、读写分离、数据加密等能力功能价值分库分表突破单库性能瓶颈读写分离提升读性能数据加密保障数据安全。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

别再硬编码了!Flowable工作流动态审批人配置全解析(Spring Boot集成版)

本文深入解析Flowable工作流在Spring Boot中的动态审批人配置技术,通过角色、部门等变量实现审批流程的灵活设计。文章详细介绍了架构原理、前端配置映射、动态候选组解析及查询优化方案,帮助企业提升审批流程的适应性和维护效率。

weixin_30919571的博客 132

Java高频面试题:ShardingSphere的核心模块有哪些?他们是如何工作的?

ShardingSphere是一个分布式数据库中间件,主要由ShardingSphere-JDBC、Proxy等核心模块构成。核心功能包括:分片模块实现水平分表,读写分离模块管理主从节点,加密模块提供列级数据保护,影子模块支持测试数据隔离,治理模块集中管理配置。其工作流程为:解析SQL→规则路由→改写SQL→执行→合并结果。通过模块化设计,ShardingSphere实现了数据库的分布式扩展、性能优化和数据安全。

java1234的博客 362

Quest 3开发第一步:搞定Meta账号登录和Oculus软件连不上设备的那些坑(2024实测)

本文详细介绍了Quest 3开发初期的关键步骤,包括Meta账号注册、Oculus软件安装与设备连接等常见问题的解决方案。针对国内开发者遇到的邮箱限制、验证码接收等难题,提供了实用的应对策略,并分享了开发环境配置和常见问题排查技巧,帮助开发者快速搭建Quest 3开发环境。

weixin_30333885的博客 491

HI3516CV610海思SOC:超高清智慧视觉开发全攻略

本文全面解析海思HI3516CV610 SOC在超高清智慧视觉开发中的应用。该芯片集成双核A7处理器、1Tops NPU、AI ISP及4K视频编码器,专为智能摄像头设计。文章详细介绍了开发环境搭建、核心硬件架构、媒体处理平台(MPP)实战、AI算法集成与系统调优等全流程攻略,帮助开发者高效构建稳定可靠的视觉AI产品。

weixin_29269441的博客 1251

ShardingSphere分库分表实战之读写分离原理解析

本篇文章主要讲解了ShardingSphere分库分表实战的核心概念,读写分离原理解析以及应用方案的学习。下节预告,ShardingSphere分库分表实战之MySQL主从同步集群的搭建,敬请期待。

Coder_ljw的博客 700

聚类技术:发展历史、主要分类与重要论文解析

在数据挖掘和机器学习的广袤领域中,聚类作为一种强大的无监督学习技术,一直扮演着至关重要的角色。它能够帮助我们从海量的数据中发现隐藏的模式和结构,将相似的数据对象归为一类,从而为进一步的分析和决策提供有价值的信息。

qq_48131648的博客 2630

Java支付与风控系统面试核心要点解析

分布式系统与AI风控是当前互联网企业的核心技术方向。在支付系统领域,高并发处理、数据一致性和资金安全是三大核心挑战,通常需要结合Spring Cloud、Redis等中间件实现高性能架构。AI风控系统则依赖特征工程和机器学习模型,通过实时规则引擎与TensorFlow Serving等技术构建智能决策体系。本文深入剖析支付路由、分布式事务等热门前沿技术,并详解微信/支付宝对接中的证书管理、签名验证等工程实践细节,为开发者提供从理论到落地的完整知识体系。

weixin_34320159的博客 374

基于Python的雪球网投资组合数据爬取与分析实战:从入门到精通

在当今数字化投资时代,数据已成为投资者最重要的资产之一。雪球网作为中国领先的投资社交平台,汇聚了大量优质的投资组合数据,这些数据对于量化投资研究和个人投资决策具有重要价值。本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的雪球网投资组合爬虫,并深入分析获取的数据。投资组合持仓明细及变动历史投资收益率曲线与风险指标投资者操作策略与调仓频率热门行业与个股关注度。

2201_76125261的博客 920

基于STM32+Qt上位机设计的智慧停车场管理系统(207)

本项目设计了一套基于STM32+Qt上位机的智慧停车场管理系统。该系统融合了先进的嵌入式技术、图像识别技术、数据库技术和移动互联网技术,通过STM32硬件端实时采集车库现场信息,包括车牌识别、车位占用状态监测等,并将数据上传至Qt上位机进行处理与展示。利用MySQL数据库存储车辆出入库记录及车位使用情况,确保数据的安全性和可追溯性;通过Android手机APP为用户提供查询、支付等功能,实现远程交互与便捷服务。

3939

【Java项目技术亮点】分库分表+数据路由策略:单表5000万后的架构升级方案

本文摘要:MySQL单表数据量超过5000万后性能急剧下降,通过分库分表可解决查询慢、写入慢等问题。文章首先介绍分库分表时机判断指标(单表数据量、QPS等),随后对比垂直拆分与水平拆分的策略及适用场景,重点解析Hash取模、范围分片等分片规则设计。实战部分展示基于ShardingSphere的分库分表配置代码,并提供雪花算法生成全局唯一ID的实现方案,解决分库分表后的数据路由与ID冲突问题。

我是一颗柠檬的博客 369

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java面试核心:Spring Boot与微服务架构深度解析

Spring Boot作为Java企业级开发的主流框架,其自动配置机制通过@SpringBootApplication复合注解和条件注解实现组件智能装配,大幅提升开发效率。微服务架构基于分布式系统理论,在CAP原则下通过服务拆分和分布式事务保证系统可用性与数据一致性。在电商秒杀等高并发场景中,Redis+Lua的原子操作与Zookeeper分布式锁成为关键技术方案。理解Spring循环依赖的三级缓存机制和Redis分布式锁的Redisson实现,能有效解决实际工程中的并发控制问题。本文结合大厂面试真题,深入

weixin_34357887的博客 365

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java大厂面试全攻略:从JVM调优到分布式系统设计

Java作为企业级开发的主流语言,其技术栈深度与系统设计能力是面试的核心考察点。从JVM内存模型到多线程并发控制,理解底层原理是解决性能问题的关键。分布式系统设计中,CAP理论与一致性算法(如Raft)构成了现代架构的基础。在电商、金融等高并发场景下,Redis缓存和消息队列(如Kafka)的技术选型直接影响系统稳定性。本文通过典型面试题解析,展示如何从字节码层面分析Java并发问题,以及基于GC日志的JVM调优实战。针对分布式场景,详细拆解了如何设计高可用优惠券系统,涵盖分库分表、熔断降级等关键技术方案。

weixin_34327223的博客 304

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【中级Java面试总结】

本文整理了Java开发面试中的常见技术问题,内容涵盖数据库优化、并发控制、设计模式、多线程、Redis、RabbitMQ等多个技术领域。主要包括:数据库查询优化方案、高并发场景下的座位预约设计、防止重复提交的方法、工厂模式解耦原理、线程池配置策略、Redis集群部署方案、消息队列可靠性保证等。同时涉及发散性问题如AI工具应用、系统集成注意事项,以及前端数据传递和性能优化方案。最后分享了针对不同面试官(HR/技术/领导)的自我介绍技巧和群面应对策略,强调项目经验与软实力的差异化展示。全文系统梳理了Java开发

qq_47769481的博客 562

互联网大厂Java面试技术栈与核心考点解析

Java技术栈作为企业级开发的核心基础,其底层原理与工程实践能力是互联网大厂面试的重点考察方向。从JVM内存模型到并发编程的AQS机制,再到Spring生态的自动配置原理,技术深度往往通过业务场景题进行验证。分布式系统设计能力成为区分高级工程师的关键指标,涉及Redis缓存策略、MySQL索引优化等高频考点。在电商秒杀等典型场景中,需要综合运用线程池调优、Spring启动加速等技术方案。掌握这些核心技术不仅有助于通过BAT等大厂面试,更能提升处理高并发、分布式事务等实际工程问题的能力。

weixin_30414305的博客 280

Java高并发与系统设计面试实战指南

高并发系统设计是分布式架构的核心挑战之一,其本质是通过多级缓存、异步处理和资源隔离等技术手段提升系统吞吐量。从技术原理看,本地缓存(Caffeine)解决单机性能瓶颈,Redis集群实现数据共享,结合消息队列(Kafka/RabbitMQ)完成异步解耦,最终构建出弹性可扩展的架构体系。这类设计在电商秒杀、游戏服务器等场景有广泛应用,其中缓存一致性、流量削峰等问题的解决方案尤为关键。本文以Java技术栈为例,详细解析大厂面试中的高并发设计方法论,包括多级缓存架构、消息队列选型等实战经验,帮助开发者掌握系统性能

weixin_30448603的博客 473

Java后端面试全攻略:从JVM到AI Agent的进阶指南

在当今的软件开发领域,Java后端开发不仅是构建稳定、高性能系统的基石,更在AI浪潮下迎来了新的机遇与挑战。理解Java虚拟机(JVM)的内存管理、垃圾回收机制以及并发编程原理,是构建高可用服务的基础。随着微服务架构和云原生技术的普及,开发者需要掌握Spring生态、分布式中间件及数据库优化等核心技能,以应对复杂的业务场景。如今,AI Agent和大模型等前沿技术正深度融入开发流程,通过智能化的代码生成、问题排查和系统优化,显著提升研发效能与系统智能水平。本文聚焦于Java后端开发者如何整合传统知识体系与A

weixin_30580341的博客 409

Sharding-JDBC强制路由案例实战

Sharding-JDBC强制路由案例实战,本篇文章主要讲解了Sharding-JDBC强制路由案例实战,实操过程非常重要,大家一定要动手亲自实践一下,必须掌握。下节预告,数据加密详解与实战,大家敬请期待呦!!!。在一些应用场景中,分片条件依赖于外部业务逻辑。因此需要提供一种通过在外部业务代码中指定路由配置的一种方式,在ShardingSphere中叫做Hint。如果使用Hint指定了强制分片路由,那么SQL将会无视原有的分片逻辑,直接路由至指定的数据节点操作。ShardingSphere使用ThreadL

Coder_ljw的博客 1565

大厂Java面试核心考点与分布式架构实战解析

Java作为企业级开发的主流语言,其技术栈深度与分布式架构能力是面试核心考察点。从JVM内存模型到并发编程原理,开发者需要掌握指令重排序、锁升级等底层机制。Spring框架的IoC容器和AOP代理等核心设计,体现了依赖注入和面向切面编程的工程实践价值。在分布式场景下,Redis+Lua脚本实现原子操作、SAGA模式处理分布式事务等方案,解决了高并发下的数据一致性问题。本文结合大厂真实面试题,详解秒杀系统防护、缓存击穿处理等高频场景,帮助开发者构建完整的Java技术体系。

weixin_34367257的博客 397

扩展分布式系统:从无状态化到水平扩展的架构实践与避坑指南

分布式系统的设计难点不在于拆分,而在于扩展。当单机资源达到上限,水平扩展成为支撑高并发的关键路径,但增加机器并不等于线性提升性能,状态管理、数据一致性、负载均衡等问题随之而来。理解垂直扩展与水平扩展的适用边界,掌握无状态化设计这一核心原则,是让系统平滑扩容的前提。数据层通过主从复制、读写分离与分片突破存储瓶颈,缓存与异步机制则能低成本优化链路。同时需权衡CAP,以幂等和最终一致性保障可靠性。本文结合实际场景,梳理从单机到多机、从能用到好用的完整方法论,为后端工程师与系统设计者提供可落地的扩展实践参考。

weixin_34176694的博客 308
上一篇: 什么是好的分库分表方案?从面试问答到亿级数据实战
下一篇: MyBatis-Plus 深度开发规范手册
BlueSea 每日coding
BlueSea 每日coding 新星创作者: Go技术领域 新星创作者: Go技术领域
博客等级 码龄14年 3414粉丝 913原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlueSea 每日coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值