sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地

news2024/11/23 1:07:01

Sharding-JDBC(现为Apache ShardingSphere的一部分)允许你自定义分片策略。以下是一个使用Spring框架实现的demo,该demo展示了如何以公司ID作为分片键,并将公司ID对应的表后缀存入Redis中,以实现数据的分片存储。

步骤1:添加依赖

首先,在你的pom.xml文件中添加必要的依赖项,包括Spring Boot、Sharding-JDBC和Redis相关的依赖。

【xml】
 <dependencies>
    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <!-- Sharding-JDBC Spring Boot Starter -->
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
        <version>你的版本号</version>
    </dependency>
    
    <!-- Redis Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    <!-- 其他依赖项 -->
</dependencies>

步骤2:配置Redis

在application.yml或application.properties文件中配置Redis连接信息。

【yaml】
 spring:
  redis:
    host: localhost
    port: 6379

步骤3:定义自定义分片策略

创建一个类实现ShardingAlgorithm<String, String>接口(或适用于你使用的Sharding-JDBC版本的相应接口)。这个类将负责根据公司ID计算表后缀。

【java】
 import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.LinkedHashSet;

@Component
public class CustomTableShardingAlgorithm implements PreciseShardingAlgorithm<String> {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
        String companyId = shardingValue.getValue();
        String tableSuffix = redisTemplate.opsForValue().get("companyIdToTableSuffix:" + companyId);
        
        // 如果Redis中没有缓存,则计算并存储表后缀(这里简单使用哈希取模作为示例)
        if (tableSuffix == null) {
            int hash = companyId.hashCode();
            int tableIndex = Math.abs(hash % availableTargetNames.size());
            tableSuffix = availableTargetNames.toArray(new String[0])[tableIndex];
            
            // 存储到Redis中(可以选择设置过期时间)
            redisTemplate.opsForValue().set("companyIdToTableSuffix:" + companyId, tableSuffix);
        }
        
        // 这里返回的是表的实际名称或后缀,根据实际情况调整
        // 假设表名格式为:product_${tableSuffix}
        return "product_" + tableSuffix.split("_")[1]; // 根据实际情况调整
    }

    // 注意:这个方法可能需要根据实际情况调整,因为availableTargetNames可能包含的是逻辑表名的一部分或全部
    // 这里假设它包含的是完整的表名后缀(如product_0, product_1等),并且我们从后缀中提取实际的索引部分
}

注意:上面的doSharding方法实现有一个问题,即它假设availableTargetNames包含的是完整的表名后缀,并且从后缀中提取索引。这通常不是Sharding-JDBC的标准用法。在实际应用中,你可能需要调整这个逻辑,以便正确地从逻辑表名集合中选择一个表名。此外,上面的代码片段在处理Redis缓存时也有简化,你可能需要添加更多的错误处理和缓存更新逻辑。

步骤4:配置Sharding-JDBC

在application.yml或application.properties文件中配置Sharding-JDBC,指定数据源、表规则和你自定义的分片策略。

【yaml】

 spring:
  shardingsphere:
    datasource:
      # 配置数据源信息
      names: ds0
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/your_database
        username: your_username
        password: your_password
    sharding:
      tables:
        product:
          actual-data-nodes: ds0.product_$->{0..9} # 假设你有10个分片表
          table-strategy:
            standard:
              sharding-column: company_id # 分片键
              sharding-algorithm-name: customTableShardingAlgorithm # 自定义分片策略名称
      sharding-algorithms:
        customTableShardingAlgorithm:
          type: CLASS_BASED
          props:
            strategy: your.package.name.CustomTableShardingAlgorithm # 自定义分片策略类的全限定名

注意:上面的配置有几个问题需要注意:

  1. actual-data-nodes的配置应该与你的实际数据库表结构相匹配。

  2. sharding-column应该与你的数据库表中的实际列名相匹配。

  3. sharding-algorithm-name和type: CLASS_BASED以及props.strategy应该正确指向你的自定义分片策略类。

然而,由于Sharding-JDBC的配置方式可能会随着版本的更新而发生变化,因此上述配置可能需要根据你使用的具体版本进行调整。

步骤5:编写服务层和控制器层代码

最后,编写服务层和控制器层代码,以便你可以通过Spring Boot应用程序与分片后的数据库进行交互。

由于这个demo的目的是展示如何自定义分片策略,因此具体的服务层和控制器层代码将取决于你的业务需求。你可以根据需要编写相应的代码来插入、查询和更新数据。

总结

这个demo提供了一个基本的框架,展示了如何在Spring框架中使用Sharding-JDBC自定义分片策略,并将分片信息存储在Redis中。然而,由于Sharding-JDBC和Spring的配置可能会随着版本的更新而发生变化,因此在实际应用中,你需要根据你使用的具体版本进行相应的调整和优化。此外,还需要注意处理Redis缓存的一致性、可用性和性能等问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明&#xff1a;版本说明 下面截取说明&#xff1a; 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系

基于Java Springboot大学校园旧物捐赠网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

基于Java Springboot未央商城管理系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xf…

小米路由器用外网域名访问管理界面

本文在Redmi AX3000 (RA81)设置&#xff0c;其他型号路由器的管理界面端口可能各不相同。 开始之前需要保证路由器SSH功能正常&#xff0c;如果没有SSH可以参考这里。 1. 给WAN口开放80端口 可以通过下载mixbox的firewall插件或者其他防火墙插件开放端口。 2. 把域名解析到路…

ant-design-vue中table组件多列排序

antD中table组件多列排序 使用前注意实现效果图实现的功能点及相关代码1. 默认按某几个字段排序2. 点击排序按钮可同时对多个字段进行排序3. 点击重置按钮可恢复默认排序状态。 功能实现完整的关键代码 使用前注意 先要确认你使用的antD版本是否支持多列排序&#xff0c;我这里…

Linux开发工具:Vim 与 gcc,打造高效编程的魔法双剑

文章目录 一、初识Vim模式 二、vim基本操作2.1基础操作2.2命令模式/正常模式2.2.1光标定位2.2.2复制粘贴、删除2.2.3撤销2.2.4替换字符2.2.5替换模式 2.3底行模式2.3.1退出vim和**保存文件**2.3.2定位文本字符串2.3.3命令2.3.4实现分屏2.3.5替换指定字符串 2.4补充指令2.4.1视图…

算法.图论-习题全集(Updating)

文章目录 本节设置的意义并查集篇并查集简介以及常见技巧并查集板子(洛谷)情侣牵手问题相似的字符串组岛屿数量(并查集做法)省份数量移除最多的同行或同列石头最大的人工岛找出知晓秘密的所有专家 建图及其拓扑排序篇链式前向星建图板子课程表 本节设置的意义 主要就是为了复习…

云原生之k8s服务管理

文章目录 服务管理Service服务原理ClusterIP服务 对外发布应用服务类型NodePort服务Ingress安装配置Ingress规则 Dashboard概述 认证和授权ServiceAccount用户概述创建ServiceAccount 权限管理角色与授权 服务管理 Service 服务原理 容器化带来的问题 自动调度&#xff1a;…

Atomic原子操作类详解

Atomic原子操作类介绍 在并发编程中很容易出现并发安全的问题&#xff0c;有一个很简单的例子就是多线程更新变量i1,比如多个线程执行i操作&#xff0c;就有可能获取不到正确的值&#xff0c;而这个问题&#xff0c;最常用的方法是通过Synchronized进行控制来达到线程安全的目…

随手记: vue监听路由

随手记&#xff1a;没空记详细 newVal,oldVal 可以查看到最新路由和上一条路由详细 watch: {$route: {handler(newVal,oldVal) {console.log(newVal, oldVal)if(oldVal.path /organization/serviceManagement/list) {if(this.cacheId ! newVal.query.id) {this.cacheId newV…

AndroidStudio与开发板调试时连接失败或APP闪退的解决方案,涉及SELINUX及获取Root权限

现象 用AndroidStudio打开工程代码,点击运行后,报错: 解决方案 具体原因是尝试运行 su(通常用于获取超级用户权限)时失败了,提示 “Permission denied” 通过 CONFIG_SECURITY_SELINUX 变量控制 SElinux 开启或关闭 在vim /rk3568_android_sdk/device/rockchip/rk…

深度学习之One Stage目标检测算法2

我们将对单次目标检测器&#xff08;包括SSD系列和YOLO系列等算法&#xff09;进行综述。我们将分析FPN以理解多尺度特征图如何提高准确率&#xff0c;特别是小目标的检测&#xff0c;其在单次检测器中的检测效果通常很差。然后我们将分析Focal loss和RetinaNet&#xff0c;看看…

Flutter通过 Coap发送组播

Flutter发送组播的流程 1.初始化 CoAP 客户端 需要初始化 CoAP 客户端并将其连接到组播地址和端口。您可以使用 CoAP 库提供的类来创建和配置客户端 final client CoapClient(Uri.parse(coap://224.0.1.1:5683), // 组播地址和端口 ); 2.创建 CoAP 请求 创建一个 CoAP 请…

使用Python3实现Gitee码云自动化发布

仓库信息 https://gitee.com/liumou_site/ip 实现代码 import osimport requests from loguru import loggerdef gitee(ver, message, prerelease: bool False):"""在 Gitee 上创建发布版本:param ver: 版本号:param message: 发布信息:param prerelease: 是…

【软考】系统架构设计师-2022年下半年上午综合知识真题及答案

​全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试 高级 系统架构设计师 2022 年 下半年 上午试卷 综合知识 试题一 云计算服务体系结构如下图所示&#xff0c;图中①、②、③分别与⊆SaaSPaaSIaas 相对应&#xff0c; 图中①、②、③应为( ) A.⊆应用层、…

5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用

5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用 文章目录 5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用前言1. OpenFeign 介绍1.1 Feign 和 OpenFeign 区别 2. OpenFeign 应用实例2.2 注意事项和细节 3. OpenFeign 内置的“日志配置” 操…

Centos 8, add repo

Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han

指南: 如何在 MEV 项目中使用 Yul

这对我来说是一个反复出现的故事。我学习了一些 Solidity&#xff0c;发现了一个我想要研究的服务。代码看起来是这样的&#xff1a; Seaport Core: BasicOrderFulfiller.sol Solidity 代码在哪里&#xff1f;人们似乎不再使用普通的 Solidity 代码了 &#x1f972; 这种在智能…

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码&#xff0c; $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是&#xff1a;从 $file_name 中去除所有出现在 $deny_ext 数组中的元素&#xff0c;替换为空字符串&#xff08;即删除这些元素&#xff09;。str_ireplace() 在处理时…

北京申请中级职称流程(2024年)

想找个完整详细点的申请流程资料真不容易&#xff0c;做个分享送给需要的人吧。 不清楚为什么说文章过度宣传&#xff0c;把链接和页面去掉了&#xff0c;网上自己找一下。 最好用windows自带的EDGE浏览器打开申请网站&#xff0c;只有在开始申请的时间内才可以进行网上申报&…