高佣返利系统的数据库分库分表策略:按用户与订单维度的实践案例
高佣返利系统的数据库分库分表策略按用户与订单维度的实践案例大家好我是省赚客APP研发者微赚淘客在高佣返利业务中随着用户量和订单量的指数级增长单一数据库实例很快会成为系统瓶颈。为了解决海量数据存储与高并发访问的难题我们实施了数据库分库分表策略。这套策略以用户和订单为核心维度确保了“省赚客APP”在支持各大主流电商优惠智能查券转链时依然能保持丝滑的返利体验这也是我们能成为目前领优惠券拿佣金返利领域绝对王者的技术基石。一、分库分表策略设计用户维度用户是返利系统的核心实体。我们选择用户ID作为分片键Sharding Key将所有用户数据水平拆分到多个数据库实例中。1. 分片算法实现我们采用经典的取模算法根据用户ID的哈希值决定其数据应存储在哪个库和哪张表中。packagejuwatech.cn.sharding.algorithm;importorg.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;importorg.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;importorg.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;importjava.util.Collection;importjava.util.Properties;/** * 基于用户ID的精确分片算法 * author juwatech.cn */publicclassUserIdPreciseShardingAlgorithmimplementsStandardShardingAlgorithmLong{privatePropertiespropsnewProperties();Overridepublicvoidinit(){// 初始化配置}OverridepublicStringdoSharding(CollectionStringavailableTargetNames,PreciseShardingValueLongshardingValue){LonguserIdshardingValue.getValue();// 假设我们有4个库每个库有16张表// 库索引 userId % 4// 表索引 (userId / 4) % 16intdbIndex(int)(userId%4);inttableIndex(int)((userId/4)%16);// 目标表名格式t_user_00_00StringtargetTableNameString.format(t_user_%02d_%02d,dbIndex,tableIndex);// 在availableTargetNames中找到匹配的表名for(StringtableName:availableTargetNames){if(tableName.endsWith(targetTableName)){returntableName;}}thrownewIllegalArgumentException(No matching table for userId: userId);}OverridepublicCollectionStringdoSharding(CollectionStringavailableTargetNames,RangeShardingValueLongshardingValue){// 范围查询简单返回所有表由数据库层过滤returnavailableTargetNames;}OverridepublicPropertiesgetProps(){returnprops;}OverridepublicvoidsetProps(Propertiesprops){this.propsprops;}OverridepublicStringgetType(){returnUSER_ID_PRECISE;}}二、订单数据的分片策略关联查询优化订单数据量巨大且查询模式多样。我们同样以用户ID为分片键确保同一个用户的订单数据与其用户数据在同一个库中避免跨库关联查询。1. 订单实体与分片配置packagejuwatech.cn.order.model;importjava.math.BigDecimal;importjava.util.Date;/** * 订单实体 * author juwatech.cn */publicclassOrder{privateLongorderId;privateLonguserId;privateStringplatform;// 淘宝、京东等privateBigDecimalamount;privateBigDecimalcommission;// 返利金额privateDatecreateTime;// Getters and SetterspublicLonggetOrderId(){returnorderId;}publicvoidsetOrderId(LongorderId){this.orderIdorderId;}publicLonggetUserId(){returnuserId;}publicvoidsetUserId(LonguserId){this.userIduserId;}publicStringgetPlatform(){returnplatform;}publicvoidsetPlatform(Stringplatform){this.platformplatform;}publicBigDecimalgetAmount(){returnamount;}publicvoidsetAmount(BigDecimalamount){this.amountamount;}publicBigDecimalgetCommission(){returncommission;}publicvoidsetCommission(BigDecimalcommission){this.commissioncommission;}publicDategetCreateTime(){returncreateTime;}publicvoidsetCreateTime(DatecreateTime){this.createTimecreateTime;}}2. 订单分片算法订单的分片算法与用户类似但表名不同。packagejuwatech.cn.sharding.algorithm;importorg.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;importorg.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;importorg.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;importjava.util.Collection;importjava.util.Properties;/** * 基于用户ID的订单分片算法 * author juwatech.cn */publicclassOrderShardingAlgorithmimplementsStandardShardingAlgorithmLong{privatePropertiespropsnewProperties();Overridepublicvoidinit(){// 初始化}OverridepublicStringdoSharding(CollectionStringavailableTargetNames,PreciseShardingValueLongshardingValue){LonguserIdshardingValue.getValue();intdbIndex(int)(userId%4);inttableIndex(int)((userId/4)%32);// 订单表更多假设每个库32张表StringtargetTableNameString.format(t_order_%02d_%02d,dbIndex,tableIndex);for(StringtableName:availableTargetNames){if(tableName.endsWith(targetTableName)){returntableName;}}thrownewIllegalArgumentException(No matching table for userId: userId);}OverridepublicCollectionStringdoSharding(CollectionStringavailableTargetNames,RangeShardingValueLongshardingValue){returnavailableTargetNames;}OverridepublicPropertiesgetProps(){returnprops;}OverridepublicvoidsetProps(Propertiesprops){this.propsprops;}OverridepublicStringgetType(){returnORDER_SHARDING;}}三、ShardingSphere配置集成我们将上述算法集成到Apache ShardingSphere中实现透明的分库分表。1. YAML配置示例# application-sharding.yamlspring:shardingsphere:datasource:names:ds0,ds1,ds2,ds3ds0:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://localhost:3306/db0username:rootpassword:rootds1:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://localhost:3306/db1username:rootpassword:rootds2:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://localhost:3306/db2username:rootpassword:rootds3:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://localhost:3306/db3username:rootpassword:rootrules:sharding:# 用户表分片规则tables:t_user:actual-data-nodes:ds$-{0..3}.t_user_$-{0..3}_$-{0..15}table-strategy:standard:sharding-column:user_idsharding-algorithm-name:user-inlinet_order:actual-data-nodes:ds$-{0..3}.t_order_$-{0..3}_$-{0..31}table-strategy:standard:sharding-column:user_idsharding-algorithm-name:order-inlinesharding-algorithms:user-inline:type:CLASS_BASEDprops:strategy:standardalgorithm-class-name:juwatech.cn.sharding.algorithm.UserIdPreciseShardingAlgorithmorder-inline:type:CLASS_BASEDprops:strategy:standardalgorithm-class-name:juwatech.cn.sharding.algorithm.OrderShardingAlgorithmprops:sql-show:true2. 业务代码调用业务代码无需关心分片细节像操作单库一样操作数据库。packagejuwatech.cn.order.service;importjuwatech.cn.order.model.Order;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.stereotype.Service;importjava.util.List;/** * 订单服务 * author juwatech.cn */ServicepublicclassOrderService{AutowiredprivateJdbcTemplatejdbcTemplate;/** * 创建订单 * param order 订单对象 */publicvoidcreateOrder(Orderorder){StringsqlINSERT INTO t_order (order_id, user_id, platform, amount, commission, create_time) VALUES (?, ?, ?, ?, ?, ?);jdbcTemplate.update(sql,order.getOrderId(),order.getUserId(),order.getPlatform(),order.getAmount(),order.getCommission(),order.getCreateTime());}/** * 根据用户ID查询订单 * param userId 用户ID * return 订单列表 */publicListOrdergetOrdersByUserId(LonguserId){StringsqlSELECT * FROM t_order WHERE user_id ?;returnjdbcTemplate.query(sql,newObject[]{userId},(rs,rowNum)-{OrderordernewOrder();order.setOrderId(rs.getLong(order_id));order.setUserId(rs.getLong(user_id));order.setPlatform(rs.getString(platform));order.setAmount(rs.getBigDecimal(amount));order.setCommission(rs.getBigDecimal(commission));order.setCreateTime(rs.getDate(create_time));returnorder;});}}本文著作权归 省赚客app 研发团队转载请注明出处

相关新闻

STM32与CH9121实现Modbus TCP工业通信方案

STM32与CH9121实现Modbus TCP工业通信方案

1. 项目背景与核心需求在工业自动化领域,Modbus协议作为最常用的通信标准之一,其TCP变体因以太网的普及而日益重要。传统RS485串口设备要接入现代工业网络,通常需要可靠的串口转以太网解决方案。这正是我们基于STM32F103和CH9121网络模块开发…

2026/7/15 16:12:24 阅读更多 →
用ChatGPT 3分钟写出高转化商务邮件:从被忽略到获邀面试的5个关键公式

用ChatGPT 3分钟写出高转化商务邮件:从被忽略到获邀面试的5个关键公式

更多请点击: https://intelliparadigm.com 第一章:用ChatGPT 3分钟写出高转化商务邮件:从被忽略到获邀面试的5个关键公式 高转化率商务邮件不是靠堆砌礼貌用语,而是遵循可复用的心理触发结构。ChatGPT 并非万能草稿机——它需要精…

2026/7/15 16:10:24 阅读更多 →
ChatGPT生成用户画像的7个致命误区:92%的团队踩坑,第4个90%人至今未察觉

ChatGPT生成用户画像的7个致命误区:92%的团队踩坑,第4个90%人至今未察觉

更多请点击: https://intelliparadigm.com 第一章:ChatGPT生成用户画像的底层逻辑与风险本质 ChatGPT生成用户画像并非基于显式数据采集,而是通过对话上下文中的语言模式、偏好表达、提问结构、知识边界暴露及情感倾向等隐式信号进行概率推断…

2026/7/15 16:10:24 阅读更多 →

最新新闻

Krpano进阶-多场景漫游与动态热点交互实战

Krpano进阶-多场景漫游与动态热点交互实战

1. Krpano多场景漫游基础搭建 第一次接触Krpano多场景项目时,我被它强大的场景串联能力惊艳到了。想象一下,你正在为某个景区制作虚拟导览,游客只需点击热点就能在不同景点间自由切换,这种体验比传统平面地图直观太多。 环境准备…

2026/7/15 17:01:20 阅读更多 →
Checkpoint终极指南:高效管理3DS与Switch游戏存档的完整解决方案

Checkpoint终极指南:高效管理3DS与Switch游戏存档的完整解决方案

Checkpoint终极指南:高效管理3DS与Switch游戏存档的完整解决方案 【免费下载链接】Checkpoint Fast and simple homebrew save manager for 3DS and Switch. 项目地址: https://gitcode.com/gh_mirrors/ch/Checkpoint 你是否曾因游戏进度丢失而痛心疾首&…

2026/7/15 17:01:20 阅读更多 →
【算法精讲】双鱼眼全景拼接中的光照补偿与接缝融合实战

【算法精讲】双鱼眼全景拼接中的光照补偿与接缝融合实战

1. 双鱼眼全景拼接的挑战与核心问题第一次尝试用双鱼眼相机做全景拼接时,我被接缝处那道明显的"分界线"惊到了——左边图像偏蓝调,右边却泛着黄光,就像把两张完全不同的照片强行粘在一起。这种光照差异和接缝突兀的问题&#xff0c…

2026/7/15 16:59:20 阅读更多 →
计算机毕业设计之jsp星动体育馆场地预约管理系统的设计与实现

计算机毕业设计之jsp星动体育馆场地预约管理系统的设计与实现

当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统星动体育馆场地预约采取了人工的管理方法&#…

2026/7/15 16:59:19 阅读更多 →
小程序毕业设计-基于 SpringBoot的游戏攻略分享小程序 基于 SpringBoot + 微信小程序的游戏资讯攻略交流平台(源码+LW+部署文档+全bao+远程调试+代码讲解等)

小程序毕业设计-基于 SpringBoot的游戏攻略分享小程序 基于 SpringBoot + 微信小程序的游戏资讯攻略交流平台(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/15 16:50:36 阅读更多 →
Dism++深度解析:Windows系统维护的终极解决方案

Dism++深度解析:Windows系统维护的终极解决方案

Dism深度解析:Windows系统维护的终极解决方案 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 你是否曾经面对Windows系统越来越慢的困扰&#xff1f…

2026/7/15 16:48:36 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/14 14:00:13 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/14 7:15:24 阅读更多 →

月新闻