正文html
使用CRL能够简单实现大数据分库分表方案,以前整理过<重磅来袭,使用CRL实现大数据分库分表方案>面试
记得有一次面试,说如今数据量愈来愈大,须要分库分表,而后给我讲了京东怎么作的,问有解决方案没,我说暂时没有,后来就没有而后了!-_数据库
回来想了想,用CRL实现也不难,不就是动态切换库表么,这些CRL原本就支持,而后用CRL简单实现了缓存
分库分表数据结构数据结构
以订单为例,此结构须要一个惟一主数据编号会员ID,订单表做为关联表,一个订单表存放完整的会员订单框架
在按指定会员ID查询数据时,按库设置,找到会员表所在的库,再按订单表设置,找到订单所在的表分布式
库表结构配置post
进行操做时,须要知道这个数据放在哪一个库,哪一个表,所以须要把这个划分结构作成可配置,须要配置有:大数据
初始数据库配置spa
如下设置一个库容量为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方法