[Java 实现水平分表 2]

news/2023/11/28 16:53:49

目录

前言:

常见的策略包括:

Java实现哈希分表策略是一种常见的分表策略:

配置分表策略

使用分表

插入数据需要按照分表策略将数据插入到对应的分表:

定义分表Mapper接口

插入数据

哈希算法分表涉及到的代码讲解:

分表查询讲解:

IN分表策略和BETWEEN 条件的分表策略 查询实现:


前言:

   水平分表需要考虑数据的一致性和查询效率等问题

常见的策略包括:

  • 取模分表策略:根据分表键的值,使用取模运算将数据分散到多个表中。

  • 范围分表策略:根据分表键的值,将数据按照一定的范围分散到多个表中,例如按照时间范围、地理位置范围等。

  • 哈希分表策略:根据分表键的哈希值,将数据分散到多个表中,可以使用一致性哈希算法等。

  • 轮询分表策略:将数据按照一定的顺序分散到多个表中,例如轮询、随机等。

  • 按业务分表策略:根据业务需求将数据分散到多个表中,例如按照用户ID、订单ID等。

Java实现哈希分表策略是一种常见的分表策略:

public class HashTableShardingStrategy implements TableShardingStrategy<MyTable> {@Overridepublic String doEqualSharding(Collection<String> availableTargetNames, ShardingValue<MyTable> shardingValue) {// 根据分表键的哈希值,计算出目标表的名称// 例如,可以使用一致性哈希算法将数据分散到多个表中long value = shardingValue.getValue().getId();int index = Math.abs(Long.hashCode(value) % availableTargetNames.size());return "my_table_" + index;}@Overridepublic Collection<String> doInSharding(Collection<String> availableTargetNames, ShardingValue<MyTable> shardingValue) {// 同上,处理IN条件的分表策略return null;}@Overridepublic Collection<String> doBetweenSharding(Collection<String> availableTargetNames, ShardingValue<MyTable> shardingValue) {// 同上,处理BETWEEN条件的分表策略return null;}
}
  1. 配置分表策略

@Configuration
public class ShardingSphereConfig {@Beanpublic HashTableShardingStrategy hashTableShardingStrategy() {return new HashTableShardingStrategy();}@Beanpublic ShardingRule shardingRule(HashTableShardingStrategy hashTableShardingStrategy) {// 配置分片规则ShardingRule shardingRule = ShardingRule.builder().tableShardingStrategy(new TableShardingStrategyConfiguration("my_table", hashTableShardingStrategy)).build();return shardingRule;}@Beanpublic DataSource dataSource(ShardingRule shardingRule) throws SQLException {// 配置数据源Map<String, DataSource> dataSourceMap = new HashMap<>();dataSourceMap.put("ds0", createDataSource("jdbc:mysql://localhost:3306/db0", "root", "root"));dataSourceMap.put("ds1", createDataSource("jdbc:mysql://localhost:3306/db1", "root", "root"));return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRule, new Properties());}private DataSource createDataSource(String url, String username, String password) {// 创建数据源HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");return dataSource;}
}
  1. 使用分表

@Service
public class MyTableServiceImpl implements MyTableService {@Autowiredprivate MyTableMapper myTableMapper;@Overridepublic List<MyTable> listByUserId(long userId) {// 根据分表键查询数据return myTableMapper.selectList(new QueryWrapper<MyTable>().eq("user_id", userId));}
}

插入数据需要按照分表策略将数据插入到对应的分表:

public class MyTable implements Serializable {private Long id;private Long userId;private String name;// 省略getter和setter方法
}
  1. 定义分表Mapper接口

public interface MyTableMapper extends BaseMapper<MyTable> {
}
  1. 插入数据

@Service
public class MyTableServiceImpl implements MyTableService {@Autowiredprivate MyTableMapper myTableMapper;@Overridepublic void insert(MyTable myTable) {// 根据分表键计算出目标表的名称String tableName = "my_table_" + Math.abs(Long.hashCode(myTable.getUserId()) % 2);// 设置目标表的名称myTable.setTableName(tableName);// 插入数据myTableMapper.insert(myTable);}
}
插入数据时,需要根据分表键计算出目标表的名称,然后将目标表的名称设置到实体类中,最后插入数据到对应的分表中。

哈希算法分表涉及到的代码讲解:

  • doEqualSharding TableShardingStrategy 接口中的一个方法,用于处理等值查询的分表策略。在使用分表时,查询语句中通常会包含分表键的等值查询条件,例如 SELECT * FROM my_table WHERE user_id = 123这时就需要根据分表键的值将查询分发到对应的分表中。
  • doEqualSharding 方法的作用就是根据分表键的值,计算出目标表的名称。具体实现可以根据分表键的值,使用取模运算、哈希算法、范围划分等方式将数据分散到多个表中,然后根据分表键的值计算出目标表的名称。
  • Collection<String> availableTargetNames 是分片规则中配置的数据源名称集合,用于指定数据源中的分表名称。在使用分表时,需要将数据分散到多个表中,每个表对应一个数据源。因此,需要在分片规则中配置数据源名称集合
  • createDataSourceMap 方法返回一个包含两个数据源的 Map 对象,其中键为数据源名称,值为数据源对象。在分片规则中,使用 dataSourceRule 方法将数据源配置到分片规则中,然后在分表策略中使用 availableTargetNames 参数获取数据源名称集合,根据分表键的值计算出目标表的名称。例如,在取模分表策略中,可以使用取模运算将数据分散到多个表中,然后根据分表键的值计算出目标表的名称

分表查询讲解:

  • 在使用分表时,查询语句中通常会包含分表键的等值查询条件,例如 SELECT * FROM my_table WHERE user_id = 123,这时就需要根据分表键的值将查询分发到对应的分表中。在 ShardingSphere 中,可以使用分片规则和分表策略来实现数据的分片和查询。
  • 在分片规则中,可以配置多个数据源和分表名称集合,然后在分表策略中根据分表键的值计算出目标表的名称,最终将查询分发到对应的数据源和分表中。在查询时,ShardingSphere 会自动将多个数据源中的查询结果合并成一个结果集返回。
  • 例如,在以下代码中,listByUserId 方法根据分表键 userId 查询数据,然后将查询结果合并成一个结果集返回:

IN分表策略和BETWEEN 条件的分表策略 查询实现:

在使用分表时,查询语句中可能会包含 IN 条件和 BETWEEN 条件,例如:

SELECT * FROM my_table WHERE user_id IN (1, 2, 3) 2SELECT * FROM my_table WHERE created_at BETWEEN '2022-01-01' AND '2022-01-31'

@Override
public Collection<String> doInSharding(Collection<String> availableTargetNames, ShardingValue<MyTable> shardingValue) {// 根据分表键的值,计算出目标表的名称集合// 例如,可以使用取模运算将数据分散到多个表中Collection<String> targetNames = new HashSet<>();for (Object value : shardingValue.getValues()) {long id = (long) value;int index = (int) (id % availableTargetNames.size());targetNames.add("my_table_" + index);}return targetNames;
}

doInSharding 方法根据分表键的值,计算出目标表的名称集合。由于 IN 条件中可能包含多个值,因此需要遍历所有值,然后根据分表键的值计算出目标表的名称,最终返回目标表的名称集合。

@Override
public Collection<String> doBetweenSharding(Collection<String> availableTargetNames, ShardingValue<MyTable> shardingValue) {// 根据分表键的值,计算出目标表的名称集合// 例如,可以使用取模运算将数据分散到多个表中Collection<String> targetNames = new HashSet<>();Range<Long> range = shardingValue.getValueRange();for (long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {int index = (int) (i % availableTargetNames.size());targetNames.add("my_table_" + index);}return targetNames;
}

doBetweenSharding 方法根据分表键的值,计算出目标表的名称集合。由于 BETWEEN 条件中包含一个范围,因此需要遍历范围内的所有值,然后根据分表键的值计算出目标表的名称,最终返回目标表的名称集合。


http://www.ppmy.cn/news/272923.html

相关文章

仿QQ音乐(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

对谈路一鸣 | 全国爱耳日,爱要让你听见

点击文末“阅读原文”即可收听本期节目 剪辑、音频 / 阿福 编辑 / SandLiu 卷圈 监制 / 姝琦 文案 / 阿福 封面 / 爱的分贝 录音间 / 声湃轩 产品统筹 / bobo 本期节目参与「酷我音乐」与「爱的分贝」公益基金会、联合发起、为听障儿童 “开启音量键” 活动 想象一下——…

巨头哄抢有声书流量,谁会是耳朵经济最终收割者?

配图来自Canva可画 近年来有声读物逐渐大众化&#xff0c;“闻声而来”的腾讯系、网易系、字节跳动系以及喜马拉雅、蜻蜓等头部音频平台越来越多&#xff0c;一场浩浩荡荡的“耳朵之战”拉开序幕。 而近日&#xff0c;腾讯音乐娱乐大刀阔斧收购懒人听书&#xff0c;将“耳朵之…

腾讯音乐回港上市,抖音取代网易云,成为腾讯音乐终极对手?

回归港股二次上市&#xff0c;腾讯音乐摸着“抖音”过河&#xff1f; 在线音乐下半场&#xff0c;竞争格局已变&#xff1b;传统老对手网易云音乐之外&#xff0c;腾讯音乐也面临短视频的新挑战。异军突起的在线演唱会&#xff0c;巨头间亦竞争激烈&#xff1a;9月2日&#xf…

完整的python项目实例-《Python爬虫开发与项目实战》pdf完整版

【实例简介】 【实例截图】 【核心代码】 目录 前言 基础篇 第1章 回顾Python编程2 1.1 安装Python2 1.1.1 Windows上安装Python2 1.1.2 Ubuntu上的Python3 1.2 搭建开发环境4 1.2.1 Eclipse PyDev4 1.2.2 PyCharm10 1.3 IO编程11 1.3.1 文件读写11 1.3…

android软件安全权威指南 pdf_目录公众号内的所有资源软件!

12月份的来临 往期的文章内容渐渐多了起来 趁着这几天有空 小鱼儿索性整合一下以往的资源 将软件进行分类 方便以后的软件管理 也方便小伙伴们的快速查找 (ps&#xff1a;点击名称即可进入相关文章) 1 1 效率工具 序号名称功能平台1一个木函日常实用工具Android2smart kit日常实…

五分钟you-get入门

title: 五分钟you-get入门 date: 2022-02-19 14:00:00 categories: python description: python you-get 1. You-Get介绍2. 用途3. 安装升级4. 参数列表 4.1. 可选参数4.2. 不影响使用的选项4.3. 下载选项4.4. 代理选项 5. 入门 5.1. 下载视频5.2. 加载cookie 6. 支持网站 1…

个人作业-软件案例分析

本篇文章写错内容了。软件工程作业在新一篇文章里&#xff1a;&#xff09; 现在许多人生活中都离不开音乐了&#xff0c;没有bgm就没有动力。大家也一定有十分熟悉的音乐软件&#xff0c;现在音乐软件提供的核心功能是什么&#xff1f;主要是为了满足人们什么需求&#xff1f;…

you-get使用二三谈 (亲测感想 )

1.you-get是什么 you-get是Github上的一个项目&#xff0c;源项目托管地址对其介绍如下&#xff1a;You-Get is a tiny command-line utility to download media contents (videos, audios, images) from the Web, in case there is no other handy way to do it. You-Get是一…

音乐间谍 v3.2

音乐间谍是免费高品质音乐下载利器&#xff01;主要提供免费的高品质音乐搜索试听下载服务&#xff0c;音乐搜索和下载功能强大&#xff0c;是资源广且简单易用的一款无损音乐下载器&#xff0c;搜索引擎网盘搜索支持国内各大网盘&#xff0c;包括&#xff1a;百度、虾米、多米…

TV版应用包名 TV常用apk包名 (当贝市场下载)

闲言&#xff1a;其实有时候我觉得做一个前端的搬砖工特别的枯燥&#xff0c;为了达到效果我们就不得不做很多枯燥的工作&#xff0c;到头来&#xff0c;只是为了显示一张图&#xff0c;这种工作都不被看在眼里&#xff0c;想想自己花了好多的时间下载apk&#xff0c;然后一个个…

云服务器、个人服务器、软路由、NAS的奇特用法(一)you-get下载视频 以b站为例(可支持网易云音乐、acfun、土豆、优酷等详情见附录)

文章目录 程序&#xff0c;让生活更懒——愿程序改变生活 前言一、you-get是什么&#xff1f;二、适用场景二、使用步骤1.安装you-get&#xff08;默认已经安装好了python3&#xff09;2.使用you-get下载视频&#xff08;以b站为例&#xff09;2.1 前台下载单个视频2.2 后台下载…

python爬虫开发与项目实战pdf_Python爬虫开发与项目实战PDF高清文档下载

随着大数据时代到来&#xff0c;网络信息量也变得更多更大&#xff0c;基于传统搜索引擎的局限性&#xff0c;网络爬虫应运而生&#xff0c;本书从基本的爬虫原理开始讲解&#xff0c;通过介绍Pthyon编程语言和Web前端基础知识引领读者入门&#xff0c;之后介绍动态爬虫原理以及…

必备浏览器插件,不用安装音乐软件全家桶,轻松下载全网音乐!

上一期给大家推荐了“二箱”这个插件&#xff0c;不少小伙伴应该都用了吧&#xff0c;效果不要说肯定刚刚的&#xff0c;既然提供关于看片的插件&#xff0c;那么有关音乐的插件同样也不能少&#xff0c;有了小七今天分享了这个插件&#xff0c;让你轻轻松松在浏览器上面就可以…

各大视频网站下载神器

先说介绍工具&#xff0c;后说使用方法&#xff08;其实不难&#xff09; you-get 是GitHub上的一个项目&#xff0c;其实就是通过几个命令行下载各大网站视频的&#xff0c;这对于做视频的爱好者及一些司机都是很奈斯的选择。 地址&#xff1a;https://github.com/soimort/y…

python爬虫开发与项目实战pdf下载_python爬虫开发与项目实战PDF高清文档下载

随着大数据时代到来&#xff0c;网络信息量也变得更多更大&#xff0c;基于传统搜索引擎的局限性&#xff0c;网络爬虫应运而生&#xff0c;本书从基本的爬虫原理开始讲解&#xff0c;通过介绍Pthyon编程语言和Web前端基础知识引领读者入门&#xff0c;之后介绍动态爬虫原理以及…

【博学谷学习记录】超强总结,用心分享 |产品经理-从盈利模式和推广方法对酷我英语和网易云音乐进行竞品分析

【博学谷学习记录】超强总结&#xff0c;用心分享 |产品经理-从盈利模式和推广方法对酷我英语和网易云音乐进行竞品分析 前言 据产业信息网报道数据&#xff0c;2020年中国网络音乐用户规模达6.58亿&#xff0c;其中手机网络音乐用户占99.74%&#xff0c;中国手机网络音乐用户…

python scrapy+Mongodb爬取蜻蜓FM,酷我及懒人听书

1、初衷&#xff1a;想在网上批量下载点听书、脱口秀之类&#xff0c;资源匮乏&#xff0c;大家可以一试2、技术&#xff1a;wireshark scrapy jsonMonogoDB3、思路&#xff1a;wireshark分析移动APP返回的各种连接分类、列表、下载地址等&#xff08;json格式&#xff09;4、思…

测试18款听书APP,免费听喜马拉雅上付费音频的办法其实很多

这两年听书好像是慢慢火了起来&#xff0c;在公众号后台也经常有人来问听书APP推荐 倒不是空穴来风&#xff0c;阿虚随便查了一下发现2020年「第十八次全国国民阅读调查报告」显示我国现在有 31.6% 的成年国民有听书习惯 多数人选择听书的原因很简单&#xff0c;无不以下&#…

【Java】JavaWEB核心要点总结:63

文章目录 1. JSP 和 Servlet 有什么区别2. JSP有哪些内置对象 分别是什么3. 详细讲解cookie session token4. 如果客户端禁止 了cookie &#xff0c;session 还能用吗5. session 的工作原理 1. JSP 和 Servlet 有什么区别 JSP&#xff08;Java Server Pages&#xff09;和Servl…
最新文章