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

相關文章
相關標籤/搜索