本系列目录
- CRL快速开发框架系列教程一(Code First数据表不需再关心)
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
- CRL快速开发框架系列教程三(更新数据)
- CRL快速开发框架系列教程四(删除数据)
- CRL快速开发框架系列教程五(使用缓存)
- CRL快速开发框架系列教程六(分布式缓存解决方案)
- CRL快速开发框架系列教程七(使用事务)
- CRL快速开发框架系列教程八(使用CRL.Package)
- CRL快速开发框架系列教程九(导入/导出数据)
- CRL快速开发框架系列教程十(导出对象结构)
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
- CRL快速开发框架系列教程十二(MongoDB支持)
- CRL快速开发框架系列教程十三(嵌套查询)
正文
使用CRL可以简单实现大数据分库分表方案,之前整理过<重磅来袭,使用CRL实现大数据分库分表方案>
记得有一次面试,说现在数据量越来越大,需要分库分表,然后给我讲了京东怎么做的,问有解决方案没,我说暂时没有,后来就没有然后了!-_
回来想了想,用CRL实现也不难,不就是动态切换库表么,这些CRL本来就支持,然后用CRL简单实现了
分库分表数据结构
以订单为例,此结构需要一个唯一主数据编号会员ID,订单表作为关联表,一个订单表存放完整的会员订单
在按指定会员ID查询数据时,按库设置,找到会员表所在的库,再按订单表设置,找到订单所在的表
库表结构配置
进行操作时,需要知道这个数据放在哪个库,哪个表,因此需要把这个划分结构做成可配置,需要配置有:
- 数据库:一共划分为几个库,主索引区间是多少
- 数据表:一共有几个分表,每个分表容量是多少
- 数据表分表:属于哪个表,主索引区间是多少
初始数据库配置
以下设置一个库容量为10,单个订单表容量为5
//创建库分组 var db = new CRL.Sharding.DB.DataBase(); db.Name = "db1"; db.MaxMainDataTotal = 10; CRL.Sharding.DB.DataBaseManage.Instance.Create(db); //创建表 var dbList = CRL.Sharding.DB.DataBaseManage.Instance.QueryList(); foreach(var item in dbList) { var table = new CRL.Sharding.DB.Table(); table.TableName = "MemberSharding"; table.IsMainTable = true; CRL.Sharding.DB.TableManage.Instance.Create(item, table, out error); var table2 = new CRL.Sharding.DB.Table(); table2.TableName = "OrderSharding"; table2.IsMainTable = false; table2.MaxPartDataTotal = 5; CRL.Sharding.DB.TableManage.Instance.Create(item, table2, out error); //创建分区 CRL.Sharding.DB.TablePartManage.Instance.Create(table2, out error); }
生成数据为(依次为,库,表,表分区)
分库分表唯一关键点是需要定位数据,CRL提供了SetLocation(id)方法,以确定库位置
插入会员数据
按上面配置,ID为3数据会插入到库DB1,表MemberSharding
var m = new Code.Sharding.MemberSharding(); m.Id =3; m.Name ="member3"; Code.Sharding.MemberManage.Instance.SetLocation(m.Id).Add(m);
插入订单
这里定位按会员ID来算
同样,按上面配置,订单会插入到库DB1,表OrderSharding_1
var order = new Code.Sharding.OrderSharding(); order.MemberId = 3; order.Remark ="order3"; Code.Sharding.OrderManage.Instance.SetLocation(3).Add(order);
查询订单
定位到库DB1,表OrderSharding_1
var list = Code.Sharding.MemberManage.Instance.SetLocation(3).QueryList(b => b.MemberId==3);
联合查询当前库
var orderManage = Code.Sharding.OrderManage.Instance.SetLocation(3); var query = orderManage.GetLambdaQuery(); query.ShardingUnion(UnionType.UnionAll); query.Where(b=>b.MemberId<5); var list = query.ToList();
调用很简单,只比一般调用多了SetLocation方法