点击▲关注 “爪哇笔记”   给公众号标星置顶

更多精彩 第一时间直达

前言

一般来说电商的日订单都是百千万级甚至是亿万级别的了,小小的数据库肯定是撑不住的,这时候就要提前考虑分库分表了。

国内一般大厂规则参考:

  • 单表500万条记录,正常水平

  • 800万条警戒线

  • 1000万条必须要分库分表

一般业界,对订单数据的分库分表,有两类思路:按照订单号来切分、按照用户id来切分,当然各有利弊,这里不细说。

手动分表

这个在秒杀一中已有体现,这里仅仅是分表而已,提供一种思路,供参考,测试的时候自行建表。

按照用户 ID 来做 hash 分散订单数据。为了减少迁移的数据量,一般扩容是以倍数的形式增加。比如原来是8个库,扩容的时候,就要增加到16个库,再次扩容,就增加到32个库。这样迁移的数据量,就小很多了。

这个问题不算很大问题,毕竟一次扩容,可以保证比较长的时间,而且使用倍数增加的方式,已经减少了数据迁移量。

String table = "success_killed_"+userId%8;
nativeSql = "INSERT INTO "+table+" (seckill_id, user_id,state,create_time)VALUES(?,?,?,?)";
Object[] params = new Object[]{seckillId,userId,(short)0,new Timestamp(System.currentTimeMillis())};
dynamicQuery.nativeExecuteUpdate(nativeSql,params);

手动撕业务逻辑是不是很low?今天给大家推荐一款分表神器。

自动分表

墙裂推荐使用开源的分布式数据库中间件 ShardingSphere,资料丰富,入手简单, 并且已于2020年4月16日成为 Apache 软件基金会的顶级项目,值得信赖。

适用于任何基于JDBCORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

  • 支持任意实现JDBC规范的数据库。目前支持 MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

集成 SpringBoot

案例使用 SpringBoot2.2.6.RELEASE + JPA,部分坐标请自行引入。

引入坐标pom.xml

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.1</version>
</dependency>
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-namespace</artifactId><version>4.0.1</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.23</version>
</dependency>

配置文件 application.properties

server.port=8080
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=truespring.shardingsphere.datasource.names=ds
spring.shardingsphere.datasource.ds.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds.url=jdbc:mysql://localhost:3306/shardingsphere?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.ds.username=root
spring.shardingsphere.datasource.ds.password=root
spring.shardingsphere.datasource.ds.max-active=16spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds.t_order_$->{0..1}
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 2}
#自增列名称,缺省表示不使用自增主键生成器
spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id
#自增列值生成器类型,缺省表示使用默认自增列值生成器。可使用用户自定义的列值生成器或选择内置类型:SNOWFLAKE/UUID
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE
#工作机器唯一id,默认为0,最大1024
spring.shardingsphere.sharding.tables.t_order.key-generator.props.worker.id=6

定义实体类,项目启动会自动生成表,也可以手动创建表:

@Data
@Entity
@Table(name = "t_order")
public final class OrderEntity{private static final long serialVersionUID = 4743102234543827854L;/*** 订单ID*/@Id@Column(name = "order_id")@GeneratedValue(strategy = GenerationType.IDENTITY)private long orderId;/*** 商品ID*/@Column(name = "goods_id")private long goodsId;/*** 用户ID*/@Column(name = "user_id")private int userId;/*** 支付状态 1 支付完成 0 支付中*/@Column(name = "pay_status")private short payStatus;}

模拟订单插入:

@Api(tags ="订单管理")
@RestController
@RequestMapping("/order")
public class OrderControl {@Autowiredprivate OrderRepository orderRepository;/*** 插入*/@PostMapping("/save")public void save(){for(int i=0;i<10;i++){OrderEntity entity = new OrderEntity();entity.setUserId(i);entity.setGoodsId(1000L);entity.setPayStatus((short)0);orderRepository.save(entity);}}
}

模拟订单插入,执行请求,向数据库插入十条订单,查看数据库,如果表t_order_0t_order_1分别有5条记录,说明配置成功。

小结

以上仅仅是一个小小的案例,大部分猿媛都不大可能接触电商实战,实际上业务极其复杂,复杂到小编都不敢轻易在这里吹牛逼。终其一生,很多公司的数据库可能还不过百万尔尔。

推荐

一款从0到1构建分布式秒杀系统,脱离案例讲架构都是耍流氓。

码址:gitee.com/52itstyle/spring-boot-seckill

程序员必备的15种微服务架构框架

真香,百万鉴黄服务源码开源了

真香,百万妹子图小程序源码开源了

100万+的妹子图微服务版本终于开源了

▲回复2020助你获得最强面霸

分布式秒杀实战之订单数据分表相关推荐

  1. 大众点评订单分库分表实践之路

    http://dbaplus.cn/news-10-264-1.html 本文是关于大众点评订单分库分表实践的一个具体分享,包含对订单库的具体切分策略,以及我个人的一些思考. 背景 订单单表早已突破两 ...

  2. Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现数据分表+读写分离

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 读写分离 在上一篇文章介绍了如何使用Sharing-JDBC实现数据库的读写分离.读写分离的好处 ...

  3. 分布式秒杀 - 实战

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列之15 [博客园总入口 ] 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版本的 ...

  4. 唯品会订单分库分表的实践总结以及关键步骤--转

    原文地址:http://www.infoq.com/cn/articles/summary-and-key-steps-of-vip-orders-depots-table 随着唯品会业务的快速发展, ...

  5. 唯品会订单分库分表的实践总结以及关键步骤

    随着唯品会业务的快速发展,订单量的不断增长,原有的订单存储架构已经不能满足公司的发展了,特别是在大促高峰期,原订单库已经成为抢购瓶颈,已经严重制约公司的发展. 唯品会旧订单库包含几十张订单相关表,旧订 ...

  6. 唯品会的订单分库分表实践总结以及关键步骤

     原创2016-06-27 叶明开.王鑫聊聊架构 聊聊架构 聊聊架构 微信号 archtime 功能介绍 在这里煮酒聊架构. 随着唯品会业务的快速发展,订单量的不断增长,原有的订单存储架构已经不能 ...

  7. (转)唯品会订单分库分表的实践总结以及关键步骤

    原文:http://www.infoq.com/cn/articles/summary-and-key-steps-of-vip-orders-depots-table 随着唯品会业务的快速发展,订单 ...

  8. 订单分库分表实践总结以及关键步骤

    转载地址:http://mp.weixin.qq.com/s?__biz=MzA5Nzc4OTA1Mw==&mid=2659597584&idx=1&sn=67f5327423 ...

  9. mysql分布式数据库架构_MySQL分布式数据库架构:分库、分表、排序、分页、分组、实现教程...

    MySQL分库分表总结: 单库单表 : 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 : 随着用户数量的增加, ...

最新文章

  1. Intellij Idea debug 模式如果发现异常,即添加异常断点在发生异常处
  2. 计算机专业的教学内容落后实例,关于中职计算机专业教学现状的思考.doc
  3. sql注入学习——布尔盲注
  4. JVM结构与OOM问题分析
  5. 开课吧:数据分析的价值体现在哪些方面?
  6. HTML5标准制定完成,浏览器大战能消停吗?
  7. VMware Fusion Pro v10.1.6 苹果虚拟机免费版及解锁许可证
  8. python移动文件_python 复制/移动文件
  9. 基于ARM+FPGA低成本高实时Ethercat运动控制器解决方案
  10. 计算机毕业设计ssm网上花店系统0716c系统+程序+源码+lw+远程部署
  11. 大型即时通讯系统微信、陌陌架构分析全记录!
  12. 阿里云国际站如何注册?
  13. 2017年各大电商平台双11回顾:值得借鉴和改进的运营手段
  14. HTML+CSS写个人简历
  15. pfamscan 的使用_使用pfam-scan进行Pfam注释
  16. Android CE DE加密小结
  17. 我的世界java版地牢种子_我的世界12个地牢种子位置解析
  18. access数据库备份与还原问题
  19. 魔兽-冰封王座进行曲
  20. win7下编译android版ffmpeg

热门文章

  1. 银河证券:A股进入全面泡沫期 看好科技网络 医药 军工概念 1
  2. ad09机械层说明_工地上的安全护栏、盖板怎么设置?请看下面的图片和说明(转载)...
  3. 网络流入门——算法模板,习题和解析
  4. 新型基础测绘与实景三维中国建设技术文件【1】名词解释
  5. Replit的野心,让Web3的创作者写代码像写文章一样简单
  6. 单板计算机图片大全,2021年全球10大最佳单板计算机开发板(SBC)(第4-6名)(图文)...
  7. python的保留字
  8. 苹果iPad mini 6评测
  9. 2021网文出海操作手日记.投放和运营
  10. 设置git大小写敏感