本系列目錄
- 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方法