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快速開發框架系列教程十三(嵌套查詢)

 正文

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM