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

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: localhostport: 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> {@Autowiredprivate StringRedisTemplate redisTemplate;@Overridepublic 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: ds0ds0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/your_databaseusername: your_usernamepassword: your_passwordsharding: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_BASEDprops: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.rhkb.cn/news/474017.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统思考—跳出症状看全局

在和企业创办人交流中&#xff0c;经常听到这样的疑问&#xff1a;“为什么我们试了这么多办法&#xff0c;问题却还是没有解决&#xff1f;”其实很多时候&#xff0c;根本原因并不在于对策不到位&#xff0c;而是连问题的本质都没找对。 曾经和一家企业合作&#xff0c;为了解…

RK3568平台开发系列讲解(platform虚拟总线驱动篇)实验:点亮一个LED

🚀返回专栏总目录 文章目录 一、设备树二、平台驱动三、应用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢xxx 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的属性,编写测试应用程序。 • 首先向设备树添加 LED 设备节点…

【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)

基于云计算、物联网、移动通信计算的智慧园区集中运营管理平台是一个高度集成化、智能化的管理系统&#xff0c;它利用先进的技术手段对园区进行全方位的监控和管理。 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审…

Nacos 配置中心变更利器:自定义标签灰度

作者&#xff1a;柳遵飞 配置中心被广泛使用 配置中心是 Nacos 的核心功能之一&#xff0c;接入配置中心&#xff0c;可以实现不重启线上应用的情况下动态改变程序的运行期行为&#xff0c;在整个软件生命周期中&#xff0c;可以极大降低了软件构建及部署的成本&#xff0c;提…

两大新兴开发语言大比拼:Move PK Rust

了解 Move 和 Rust 的差异有助于开发者根据项目的具体需求选择最合适的语言。选择不恰当的语言可能会导致项目后期出现技术债务。不同语言有其独特的优势。了解 Move 和 Rust 的差异可以帮助开发者拓展技术视野&#xff0c;发现不同语言在不同领域的应用潜力。 咱们直奔主题&a…

【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法

【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法 目录 文章目录 【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法目录摘要&#xff1a;研究背景&#xff1a;问题与挑战&#xff1a;如何解…

面试题:Kafka(一)

1. Kafka如何保证消息不丢失 生产者发送消息到Brocker丢失 设置异步发送 消息重试 消息在Brocker中存储丢失 发送确认机制acks 消费者从Brocker接收消息丢失 Kafka 中的分区机制指的是将每个主题划分成多个分区&#xff08;Partition&#xff09;topic分区中消息只能由消费者…

基于多模板配准的心腔分割算法

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月18日20点09分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…

ScubaGear:用于评估 Microsoft 365 配置是否存在安全漏洞的开源工具

ScubaGear 是由网络安全和基础设施安全局 (CISA) 创建的开源工具&#xff0c;用于自动评估 Microsoft 365 (M365) 配置中是否存在潜在的安全漏洞。 ScubaGear 分析组织的 M365 租户配置&#xff0c;提供可操作的见解和建议&#xff0c;以帮助管理员解决安全漏洞并加强 Microso…

PgSQL汇总

SQL sql执行顺序 1.from 2.on 3.join 4.where 5.group by(开始使用select中的别名&#xff0c;后面的语句中都可以使用) 6. avg,sum.. 7.having 8.select 9.distinct 10.order by 11.limit⭐流程控制语句 CASE 写法一&#xff1a; CASE case_valueWHEN when_value THENsta…

.NET 简介

文章目录 一、组件二、免费且开源三、支持四、.NET 生态系统 .NET 是一个免费的跨平台开放源代码开发人员平台&#xff0c;用于生成多种类型的应用程序。 .NET 可以运行使用多种语言编写的程序&#xff0c;其中 C# 是最常用的语言。 .NET 依赖于许多大规模应用在生产中使用的高…

Linux之vim模式下全选命令

在Linux系统中&#xff0c;使用Vim编辑器进行全选操作可以通过以下几种方式实现&#xff1a; 1.使用键盘快捷键 按下 ”ggVG”&#xff08;先按下”g”&#xff0c;再按下”g”&#xff0c;再按下”V”&#xff0c;最后按下”G”&#xff09;可以全选当前文件内容。其中 ”g…

【学习笔记】大模型调优(llms_tuning)

项目地址&#xff1a;GitHubchunhuizhang/llms_tuning 文章目录 01 TRL SFTTrainer 中的 formatting_func 与 DataCollatorForCompletion02 accelerate ddp 与 trl SFTTrainer03 finetune_llama3_for_RAG04 optimizer Trainer 优化细节&#xff08;AdamW&#xff0c;grad clip、…

剧本杀门店预约小程序,解锁沉浸式推理体验

一、开发背景 剧本杀作为一种热门娱乐游戏&#xff0c;深受大众的欢迎&#xff0c;但随着市场的快速发展&#xff0c;竞争也在不断加大&#xff0c;对于剧本杀线下商家来说面临着发展创新。 剧本杀线下门店数量目前正在逐渐增加&#xff0c;竞争激烈&#xff0c;而门店的获客…

OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算

本文实现Python库d和OpenCV来实现眼部闭合检测&#xff0c;主要用于评估用户是否眨眼。 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;如dlib、OpenCV和scipy。通过argparse设置了输入视频和面部标记预测器的参数。 from…

candence : 如何利用EXCEL 绘制复杂、多管脚元件

如何利用EXCEL 绘制复杂、多管脚元件 前面的步骤直接略过 我们以STM32F407VEXX 系列 100pin 芯片为例讲解&#xff1a; 1、新建好一个空元件 2、使用阵列&#xff0c;放置管脚 点击 “ ok ” 3、选中所有管脚 右键 “edit properites” 出现如下页面 4、点击 左上角&…

Java多线程回顾总结

目录 一.线程与创建线程方式简介 二.Thread继承 三.实现Runnable接口 四.Callable接口 五.使用线程池 一.线程与创建线程方式简介 线程与进程的区别&#xff1a; 1、一个进程至少包含一个线程 2、比如电脑上QQ,运行起来就是一个进程&#xff0c;QQ可以聊天同时也可以传文…

深度学习基础练习:代码复现transformer重难点

2024/11/10-2024/11/18: 主要对transformer一些比较难理解的点做了一些整理&#xff0c;希望对读者有所帮助。 前置知识&#xff1a; 深度学习基础练习&#xff1a;从pytorch API出发复现LSTM与LSTMP-CSDN博客 【神经网络】学习笔记十四——Seq2Seq模型-CSDN博客 【官方双语】一…

Java连接MySQL(测试build path功能)

Java连接MySQL&#xff08;测试build path功能&#xff09; 实验说明下载MySQL的驱动jar包连接测试的Java代码 实验说明 要测试该情况&#xff0c;需要先安装好MySQL的环境&#xff0c;其实也可以通过测试最后提示的输出来判断build path是否成功&#xff0c;因为如果不成功会直…

DQN系列算法详解

代码链接见文末 1. Q-learning 1.1 概述 Q-Learning是一种强化学习算法,目的是通过选择能带来最大长期收益的行为来完成任务。 做事包含瞬时奖励和记忆经验奖励: 在Q-Learning中,每个动作都会带来“瞬时奖励”,同时也会根据过去的经验记住哪些行为更有利。瞬时奖励: 这里…