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