java多用户商城系统源码架构篇——分库分表
目前公司数据量已经上来,单表最大已经5千万,之前使用分区表,用起来有很多需要注意的地方,以及坑等。
所以就在年后准备做分库分表,筛选了N多中间件、框架,似乎都不满足。主要在以下几点。
比如用阿里的myCat,需要学习、研究,因为我们目前有点急,需要安排人去研究,而且需要深入研究,结果就是搞了几天没啥头绪。但是原理就是做代理,这个了解透了。
在看当当网提供的sharding-jdbc分库分表案例,也是同样问题,没那么多时间研究,而且这几家提供的东西,居然官网都是英文/中文,中文文档也是按照老外风格写,尽量给你增加门槛!!!
于是乎就萌生自己写分库分表。
废话不多说。
1、首先是老数据问题,这个是网上所有文章没有提到的,没有提到这个问题的文章,可以说99.99%没玩过分库分表。
对于5000万的数据量,做切分,一张表控制在100万,你手动去复制粘贴???,每隔一段时间手动建库???
据说当当是手动,应该是写的程序手动的。。。。伤不伤???
其实很简单,我用JDBC写的,查到老库所有表名,create table newTableName like oldTableName;这样可以把表结构、索引结构都拷贝过来到新库,但是不会拷贝数据,网上有另一条SQL,我想大家已经玩过了,那个索引、主键不会拷贝。。
2、如何做数据分散存储
很多人肯定看过文章,ID取模呀。那如果数据量又达到瓶颈咋搞?阿里的单表12年就已经100亿了。。。。
所以说ID取模并不是仅仅这么简单,还需要数据量控制,我这里有个更好办法,其实就是简单数据量控制。
达到100万就Next,ID是自增的,出去100万,余数为0则Next。当然ID取模这么流行的方法都是阿里、58、京东这些架构师出来讲培训说的,其实你实际去操作,有其他N多方法,没有必要照搬。。。。
3、多表、关联关系如何建立?
你怎么知道User表包含哪些Order表呢?,如果一个user出的订单既有在N库,也有在N+1、N+2库里面呢?
通过user_id查询order。一般单库做关联查询,其实多库也可以,只是索引会失效而已了。然后2千万*5千万扫描。。。。
我看过唯品会的解决方案,他们是Order_id中间一段是user_id,完美不,很完美。。。。
但是,我们已经有5000万数据了,人家唯品会有的是钱,拉500人团队搞呗。。。2个月搞完。
我们几个人?就是我一个人。。。。伤不伤吧。。
所以这个方案不行,唯品会文章中丢弃的一个方案就是建立中间对应关系。
就是user_id和order_联合加上order_id所在库。他们丢弃的原因是中间表会巨大,确实。
但是如果放在redis缓存中就没有这个问题了,redis缓存只要空间足够大,性能2~3个亿没问题。
redis缓存还可以做切分啊,也算是完美符合我们这种小公司了吧。
4、如何取数据?
对于一对一查询,以前关联查询、子查询,现在都用子查询,分为两次查询。这个时间上只是毫秒差异。不用联合多库查询。(题外话,做互联网公司项目,几乎不会需要用外键、关联查询的。。。一般都是分多次查询,或者通过缓存系统拿空间换时间,怎么玩?比如微博一个用户发文章,不做文章表,所有文章放在user的下面,每个user下面都是自己的,那么查询起来就是查user就OK。)
对于一对多查询,就是2里面提到的,已经知道库了,那么具体查询方案我们还是多次查询。
对于多对多,更简单了,中间关系建立好,比以前多对多查询更简单了。这会还是一对多查询。
以上就是我们对于分库分表的解决方案。其实分库分表非常简单。我一个人搞了一个月吧。。。
如果你需要电商,B2B2C商城系统,并且支持分布式、分库分表,可以联系我探讨。
其实有N多解决方案,最好是团队讨论,更方便沟通,文章也不能全部说出来,我写的过程遇到过N多有意思的事情以及各个框架急需提供对于扩展大数据量的问题。。。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
PHP 生成唯一订单号函数
应用场景 在开发购物功能,涉及到支付比如 微信、支付宝,当下单时需要生成一条唯一的订单,需要用到唯一的订单号管理。 函数代码 /** * 得到新订单号 * @return string */ function get_order_sn() { /* 选择一个随机的方案 */ mt_srand((double) microtime() * 1000000); return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); } 实例代码 /* 插入订单表 */ $error_no = 0; do { $order['order_sn'] = get_order_sn(); //获取新订单号 $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('order_info'), $order, 'INSERT'); $error_no = $GLOBALS['db']->errno(); if ($error_no > 0 && $...
- 下一篇
Python之使用Pandas库实现MySQL数据库的读写
本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写。首先我们需要了解点ORM方面的知识。 ORM技术 对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是把关系数据库的表结构映射到对象上,通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 在Python中,最有名的ORM框架是SQLAlchemy。Java中典型的ORM中间件有:Hibernate,ibatis,speedframework。 SQLAlchemy SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。 可以使用pip命令安装SQLAlchemy模块: pip install sqlalchemy SQLAlchemy模块提供了create_engine()函数用来初始化数据库连接,SQLAlchemy用一个字符串表示连接信息: ‘数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名’ Pandas读写...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果