CRL快速开发框架系列教程十一(大数据分库分表解决方案)

本系列目录

  1. CRL快速开发框架系列教程一(Code First数据表不需再关心)
  2. CRL快速开发框架系列教程二(基于Lambda表达式查询)
  3. CRL快速开发框架系列教程三(更新数据)
  4. CRL快速开发框架系列教程四(删除数据)
  5. CRL快速开发框架系列教程五(使用缓存)
  6. CRL快速开发框架系列教程六(分布式缓存解决方案)
  7. CRL快速开发框架系列教程七(使用事务)
  8. CRL快速开发框架系列教程八(使用CRL.Package)
  9. CRL快速开发框架系列教程九(导入/导出数据)
  10. CRL快速开发框架系列教程十(导出对象结构)
  11. CRL快速开发框架系列教程十一(大数据分库分表解决方案)
  12. CRL快速开发框架系列教程十二(MongoDB支持)
  13. CRL快速开发框架系列教程十三(嵌套查询)

 正文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方法

相关文章
相关标签/搜索