亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

長文多圖:一文講清楚應(yīng)對單數(shù)據(jù)表海量數(shù)據(jù)的六種策略( 四 )


上述方法優(yōu)點(diǎn)是對范圍查詢比較友好 , 例如我們需要統(tǒng)計第一季度的相關(guān)數(shù)據(jù) , 查詢條件直接輸入時間范圍即可 。




但是這個方案問題是容易產(chǎn)生熱點(diǎn)數(shù)據(jù) 。例如雙11當(dāng)天下單量特別大 , 就會導(dǎo)致11月這張表數(shù)據(jù)量特別大從而造成訪問壓力 。


5.2.2 查表分片查表法是根據(jù)一張路由表決定ShardingKey路由到哪一張表 , 每次路由時首先到路由表里查到分片信息 , 再到這個分片去取數(shù)據(jù) 。
我們分析一個查表法實際案例 。Redis官方在3.0版本之后提供了集群方案Redis Cluster , 其中引入了哈希槽(slot)這個概念 。
一個集群固定有16384個槽 , 在集群初始化時這些槽會平均分配到Redis集群節(jié)點(diǎn)上 。每個key請求最終落到哪個槽計算公式是固定的:
SLOT = CRC16(key) mod 16384
那么問題來了:一個key請求過來怎么知道去哪臺Redis節(jié)點(diǎn)獲取數(shù)據(jù)?這就要用到查表法思想 。
(1) 客戶端連接任意一臺Redis節(jié)點(diǎn) , 假設(shè)隨機(jī)訪問到為節(jié)點(diǎn)A(2) 節(jié)點(diǎn)A根據(jù)key計算出slot值(3) 每個節(jié)點(diǎn)都維護(hù)著slot和節(jié)點(diǎn)映射關(guān)系表(4) 如果節(jié)點(diǎn)A查表發(fā)現(xiàn)該slot在本節(jié)點(diǎn)則直接返回數(shù)據(jù)給客戶端(5) 如果節(jié)點(diǎn)A查表發(fā)現(xiàn)該slot不在本節(jié)點(diǎn)則返回給客戶端一個重定向命令 , 告訴客戶端應(yīng)該去哪個節(jié)點(diǎn)上請求這個key的數(shù)據(jù)(6) 客戶端再向正確節(jié)點(diǎn)發(fā)起連接請求
查表法優(yōu)點(diǎn)是可以靈活制定路由策略 , 如果我們發(fā)現(xiàn)有的分片已經(jīng)成為熱點(diǎn)則修改路由策略 。缺點(diǎn)是多一次查詢路由表操作增加耗時 , 而且路由表如果是單點(diǎn)也可能會有單點(diǎn)問題 。


5.2.3 哈希分片現(xiàn)在比較流行的分片方法是哈希分片 , 相較于范圍分片 , 哈希分片可以較為均勻?qū)?shù)據(jù)分散在數(shù)據(jù)庫中 。我們現(xiàn)在將訂單庫拆分為4個庫編號為[0,3] , 每個庫4張表編號為[0,3] , 如下圖如所示:




我們現(xiàn)在使用orderId作為ShardingKey , 那么orderId=100的訂單會保存在哪張表?我們來計算一下:由于是分庫分表 , 首先確定路由到哪一個庫 , 取模計算得到序號為0表示路由到db[0]
db_index = 100 % 4 = 0
庫確定了接著在db[0]進(jìn)行取模表路由
table_index = 100 % 4 = 0
最終這條數(shù)據(jù)應(yīng)該路由至下表
db[0]_table[0]
最終計算結(jié)果如下圖所示:




在實際開發(fā)中最終路由到哪張表 , 并不需要我們自己算 , 因為有許多開源框架就可以完成路由功能 , 例如ShardingSphere、TDDL等等 。


6 異現(xiàn)在數(shù)據(jù)已經(jīng)使用哈希分片方法完成了水平拆分 , 我們選擇的ShardingKey是orderId 。這時客戶端需要查詢orderId=111的數(shù)據(jù) , 查詢語句很簡單如下:
SELECT * FROM order WHERE orderId = 111
這個語句沒有問題 , 因為查詢條件包含orderId , 可以路由到具體的數(shù)據(jù)表 。
現(xiàn)在如果業(yè)務(wù)想要查詢用戶維度的數(shù)據(jù) , 希望查詢userId=222的數(shù)據(jù) , 現(xiàn)在問題來了:以下這個語句可以查出數(shù)據(jù)嗎?
SELECT * FROM order WHERE userId = 222
答案是可以 , 但是需要掃描所有庫的所有表 , 因為無法根據(jù)userId路由到具體某一張表 , 這樣時間成本會非常高 , 這種場景怎么辦呢?
這就要用到數(shù)據(jù)異構(gòu)的思想 。數(shù)據(jù)異構(gòu)核心是用空間換時間 , 簡單一句話就是一份數(shù)據(jù)按照不同業(yè)務(wù)需求保存多份 , 這樣做是因為存儲硬件成本不是很高 , 而互聯(lián)網(wǎng)場景對響應(yīng)速度要求很高 。


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: