精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

ShardingSphere5.2.1生產級分庫分表實現

數據庫 MySQL
我們完成了在DailyMart中集成分庫分表功能的實踐,大家在實施分庫分表過程中一定要結合自己的業務實際選擇合理的分片鍵,分片鍵的好壞決定了你分庫分表架構方案的好壞。

大家好,我是飄渺。

隨著業務的不斷發展,DailyMart每天產生的銷售訂單已經達到了約100萬,并且呈持續增長趨勢。按照這樣的發展速度,每年的數據量將達到約4億左右。目前,DailyMart采用的是MySQL單表進行存儲,但鑒于業務的快速發展,我們迫切需要對其進行分庫分表的改造。今天,我們來探討如何實現分庫分表功能,以及相關的步驟和注意事項。

這是本系列文章的第31篇,歡迎持續關注。

對于分庫分表的相關知識,我的星球分庫分表專欄有詳細的介紹說明,強烈推薦大家加入學習。

分庫分表的核心在于合理選擇分片鍵以及快速定位非分片鍵的數據。

分片鍵的選擇

DailyMart作為一個ToC的業務系統,大部分業務訪問都是基于用戶ID進行的,比如登錄用戶查看自己的購買記錄等。因此,對于訂單模塊我們決定以用戶ID作為分片鍵。

在訂單模塊中,訂單主表 CUSTOMER_ORDER 和訂單明細表 ORDER_ITEM 是最核心的兩張表,由于它們經常會一起使用,我們也需要將訂單明細表的用戶字段 CUSTOMER_ID 作為分片鍵,以確保基于用戶維度的查詢在單個分片上完成。下面是一個示例SQL:

SELECT * FROM CUSTOMER_ORDER ORDER
LEFT JOIN ORDER_ITEM ITEM ON ORDER.order_sn = ITEM.order_sn
WHERE ORDER.customer_id = 2846741676215238657
ORDER BY create_time DESC LIMIT 10

非分片鍵查詢

既然確定使用用戶ID作為分片鍵,大部分查詢都需要帶上CUSTOMER_ID作為查詢條件。但在實際使用中,經常會根據訂單編號ORDER_SN進行精確查詢,比如庫存扣減、支付后的反查等。在默認情況下,根據訂單編號(非分片鍵)進行查詢將需要在所有分片上進行查詢,然后對結果進行聚合,顯然這樣的查詢效率是很低的。

為了解決這個問題,業界一般采用基因法來解決,即將分片鍵的信息保存在想要查詢的列中,這樣通過查詢的列就能直接知道數據所在的分片信息。

基因法的原理是 對一個數取余2的n次方,那么余數就是這個數的二進制的最后n位數。

以訂單表為例,對訂單表我們根據CUSOMER_ID將其拆成16張表,采用CUSOMER_ID % 16的方式來進行數據庫路由,這里的CUSOMER_ID % 16,其本質是CUSOMER_ID的最后4個bit位 log(16,2) = 4 決定這行數據落在哪個分片上,這4個bit就是分片基因。

基于這一理論,基因法有兩種具體的實現:

基因替換法

  1. 在生成訂單編號ORDER_SN時,先使用一種分布式ID生成算法生成前60bit
  2. 計算出分片基因:分庫基因是CUSTOMER_ID的最后4個bit,log(16,2) = 4,即1001
  3. 將分庫基因加入到ORDER_SN的最后4個bit(上圖中粉色部分)
  4. 拼裝成最終的64bit訂單ORDER_SN(上圖中藍色部分)

圖片

這樣保證了同一個用戶創建的所有訂單都落到了同一個分片上,ORDER_SN的最后4個bit都相同,通過CUSTOMER_ID %16 能夠定位到分片,通過ORDER_SN % 16也能定位到分片。

基因替換法可能會導致ORDER_SN重復,以雪花算法為例,假設同一個用戶在一毫秒內創建了 2 個訂單,這樣生產的序列號相差1,替換掉基因后對應的二進制都相同了,導致ORDER_SN也是重復的。但這種情況非常少見,除非是機器人刷單。當然如果要徹底杜絕訂單編號重復問題可以使用下面介紹的基因拼接法。

基因拼接法

基因拼接法更簡單,就是在構建訂單編號時直接將用戶基因拼接在生成的ID后面,即:ORDER_SN = string(ORDER_SN + CUSTOMER_ID)

假設開始生成的訂單號是3531318506608209922,用戶ID為2846741676215238658,那最終生成的編號為35313185066082099222846741676215238658。為了減少長度,我們可以只取用戶ID的最后6位進行拼接,生成的編號為3531318506608209922238658,這樣可以支持2^6=64個分片。

那么此時如果根據 ORDER_SN 進行查詢:

SELECT * FROM CUSTOMER_ORDER
WHERE ORDER_SN = '3531318506608209922238658';

由于字段 ORDER_SN 的設計中直接包含了分片鍵信息,所以我們可以直接通過分片鍵部分直接定位到分片上。

基因拼接法的缺點是,對應的鍵會變大一些,存儲也會相應變大,但是卻可以大大提升后續的查詢效率,這種空間換時間的設計,總體上看是非常值得的。

實際上淘寶的訂單號也是這樣構建的,如下圖所示,訂單的最后6位都是607041,所以大概率推測出:

  1. 淘寶訂單表的分片鍵是用戶 ID;
  2. 淘寶訂單表,訂單表的主鍵包含用戶 ID,也就是分片信息。這樣通過訂單號進行查詢,可以獲得分片信息,從而查詢 1 個分片就能得到最終的結果。

圖片

代碼實現

在DailyMart中選擇使用shardingsphere實現分庫分表功能,不過為了方便演示,我在這里只進行分表操作。

1、首先,將原始訂單表和訂單明細表分別拆成4個表

圖片

2、在訂單模塊基礎設施層中引入shardingsphere,

<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  <version>5.2.1</version>
</dependency>

3、編寫復合分片算法,實現基于order_sn和customer_id的查詢

public class OrderGenComplexTableAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
  ...
    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, ComplexKeysShardingValue<Comparable<?>> shardingValue) {

        Map<String, Collection<Comparable<?>>> columnNameAndShardingValuesMap = shardingValue.getColumnNameAndShardingValuesMap();

        Collection<String> result = new LinkedHashSet<>(availableTargetNames.size());

        if(MapUtils.isNotEmpty(columnNameAndShardingValuesMap)){
            // 獲取用戶ID
            Collection<Comparable<?>> userIdCollection = columnNameAndShardingValuesMap.get(USER_ID_COLUMN);
            //用戶分片
            if(CollectionUtils.isNotEmpty(userIdCollection)){
                userIdCollection.stream().findFirst().ifPresent(comparable -> {
                    long tableNameSuffix = (Long) comparable % shardingCount;
                    result.add(shardingValue.getLogicTableName() + "_" + tableNameSuffix);
                });
            }else {
                Collection<Comparable<?>> orderSnCollection = columnNameAndShardingValuesMap.get(ORDER_ID_COLUMN);
                orderSnCollection.stream().findFirst().ifPresent(comparable -> {
                    String orderSn = String.valueOf(comparable);
                    //獲取用戶基因
                    String substring = orderSn.substring(Math.max(0, orderSn.length() - 6));
                    long tableNameSuffix = Long.parseLong(substring) % shardingCount;
                    result.add(shardingValue.getLogicTableName() + "_" + tableNameSuffix);
                });
            }
        }
        return result;
    }
  ...
}

在上述代碼中,當通過用戶ID進行查詢時直接通過分片鍵取模定位分片,如果是基于訂單查詢先獲取用戶基因,再根據用戶基因取模定位分片。

4、在application.yaml中配置分庫分表

spring:
  shardingsphere:
    datasource:
      names: ds0
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: org.mariadb.jdbc.Driver
    rules:
      sharding:
        sharding-algorithms:
          order-gen-complex-sharding:
            type: CLASS_BASED
            props:
              strategy: COMPLEX
              algorithmClassName: com.jianzh5.dailymart.module.order.infrastructure.config.OrderGenComplexTableAlgorithm
              sharding-count: 4
        tables:
          customer_order:
            actual-data-nodes: ds0.customer_order_$->{0..3}
            table-strategy:
              complex:
                sharding-algorithm-name: order-gen-complex-sharding
                sharding-columns: order_sn,customer_id
          order_item:
            actual-data-nodes: ds0.order_item_$->{0..3}
            table-strategy:
              complex:
                sharding-algorithm-name: order-gen-complex-sharding
                sharding-columns: order_sn,customer_id

通過上述步驟,在訂單模塊中已經集成了分庫分表功能,接下來編寫兩個接口對其進行測試。

測試

在訂單模塊的接口層我們定義了兩個接口用于模擬實際的業務場景:1、獲取指定用戶的訂單分頁列表;2、根據訂單編號獲取訂單詳情。

接口定義如下:

@Operation(summary = "根據用戶ID分頁查詢訂單")
@GetMapping("/api/pd/order/page")
public PageResponse<OrderRespDTO> pageQuery(@Valid OrderPageQueryDTO orderPageQueryDTO) {
  return orderService.findListByUserId(orderPageQueryDTO);
}


@Operation(summary = "根據訂單號查詢訂單詳情")
@GetMapping("/api/pd/order/{orderSn}")
public OrderRespDTO getOrderBySn(@PathVariable("orderSn") String orderSn) {
  return orderService.getOrderBySn(orderSn);
}

通過運行結果可知,根據用戶訂單獲取分頁列表時直接根據Customer_id取模,只需要一次查詢即可定位。

圖片

當根據訂單號查詢訂單詳情時,根據用戶基因取模,同樣也只需要一次查詢即可定位。

圖片圖片

小結

通過以上步驟,我們完成了在DailyMart中集成分庫分表功能的實踐,大家在實施分庫分表過程中一定要結合自己的業務實際選擇合理的分片鍵,分片鍵的好壞決定了你分庫分表架構方案的好壞。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2024-07-10 08:42:39

2020-07-30 17:59:34

分庫分表SQL數據庫

2019-11-12 09:54:20

分庫分表數據

2021-08-31 20:21:11

VitessMySQL分庫

2023-08-11 08:59:49

分庫分表數據數據庫

2020-11-18 09:39:02

MySQL數據庫SQL

2025-02-10 08:20:09

2024-07-26 00:16:11

2025-04-01 08:45:00

2024-11-15 09:54:58

2021-01-26 05:37:08

分庫分表內存

2020-07-28 09:04:09

NewSQL分庫分表

2022-07-11 08:16:47

NewSQL關系數據庫系統

2020-11-17 08:08:34

分庫分表

2013-07-26 10:08:35

創業創業心得

2019-01-16 14:00:54

數據庫分庫分表

2025-04-03 09:39:14

2021-03-01 10:10:39

數據遷移擴容

2019-07-31 09:27:23

數據庫MySQLSQL

2024-01-03 08:14:33

GreatSQLMyCat庫名字
點贊
收藏

51CTO技術棧公眾號

天天爽天天狠久久久| 在线日韩日本国产亚洲| 国产尤物av一区二区三区| www.97av.com| 香蕉亚洲视频| 最近2019好看的中文字幕免费| 午夜啪啪小视频| xxxx另类黑人| 亚洲国产精品99久久久久久久久| 91精品综合久久久久久五月天| 免费中文字幕在线观看| 亚洲a级精品| 91精品久久久久久蜜臀| 国产亚洲精品网站| av电影免费在线观看| 99国产精品久久久久久久久久久 | 国产伦精品一区二区三区高清版 | 日韩黄色小视频| 久久综合88中文色鬼| 91精品小视频| 国产一区 二区| 91黄色免费网站| 大西瓜av在线| 黄色网址免费在线观看| 久久影院午夜片一区| 亚洲最大av在线| 国产男女在线观看| 午夜av在线播放| 国产欧美一区在线| 日韩美女毛茸茸| 久久国产精品二区| 天天色天天射综合网| 亚洲人成网站777色婷婷| 日本少妇一区二区三区| 成人短视频在线观看| 久久精品亚洲乱码伦伦中文| 国产精品免费一区二区三区四区| 91tv国产成人福利| 久久一区亚洲| 欧美性视频精品| 波多野结衣一本| 日本亚洲视频| 欧美一级二级三级乱码| 伊人成人222| 日韩欧美精品一区二区综合视频| 精品欧美激情精品一区| 日韩亚洲欧美视频| 欧美人与禽猛交乱配| 亚洲欧美日韩国产综合在线| 亚洲在线欧美| 中文字幕在线观看日本| 国产日韩av一区| 日韩精品av一区二区三区| 你懂的免费在线观看| 久久你懂得1024| 日本一区二区三不卡| 久久久久国产精品嫩草影院| 91丨九色丨尤物| 久久综合一区| 日本ー区在线视频| 久久精品夜色噜噜亚洲aⅴ| 日本一区网站| 在线激情小视频| 亚洲欧美综合色| 国产树林野战在线播放| 亚洲精品一线| 亚洲高清免费观看| 欧美日韩二三区| 日本美女一区| 欧美日韩免费观看一区二区三区| 一级片视频免费观看| 在线观看男女av免费网址| 亚洲精品视频在线| 人人干视频在线| 这里有精品可以观看| 色呦呦国产精品| 五月婷婷丁香色| 欧美1区2区3| 亚洲黄色成人网| 亚洲精品一区二区三区影院忠贞| 日本久久黄色| 欧美日韩国产成人在线观看| 日本一区二区三区四区五区| 久久久噜噜噜久久狠狠50岁| 国产精品永久在线| www.97超碰| www国产亚洲精品久久麻豆| 欧美日韩国产不卡在线看| 伊人免费在线| 亚洲电影一区二区三区| 精品久久久久久无码国产| www.欧美视频| 在线观看91视频| 污污的视频免费| jizz性欧美23| 宅男66日本亚洲欧美视频| 日韩va亚洲va欧美va清高| 亚洲高清自拍| 国产亚洲福利一区| 四虎永久免费在线| 亚洲一区黄色| 成人激情电影一区二区| 三级小视频在线观看| 欧美高清在线精品一区| 青青在线视频免费观看| 欧美国产大片| 日韩欧美在线影院| 一级片久久久久| 欧美视频福利| 国产精品视频免费在线观看| 亚洲欧美另类视频| 国产精品久久久久久久久快鸭| av在线观看地址| 欧美三级电影网址| 亚洲精品一区av在线播放| 午夜福利三级理论电影| 精品久久电影| 午夜精品久久久久久99热| 一级成人免费视频| 久久久久久久一区| 人妻少妇精品久久| 国产在线不卡一区二区三区| 国产亚洲精品久久久优势| 国产一级片免费看| 影音先锋中文字幕一区| 国产伦精品一区二区三区精品视频| 深爱激情五月婷婷| 一区二区三区在线播放| 亚洲人视频在线| 欧美系列电影免费观看| 97av在线影院| 精品国产乱子伦| 成人免费视频国产在线观看| 特级毛片在线免费观看| av在线日韩| 国产婷婷成人久久av免费高清| 在线观看成人毛片| 精品一区二区三区久久久| 深田咏美在线x99av| 欧美电影网站| 亚洲一二三在线| 国产精品久久久久久人| 91视频91自| 日韩av片在线看| 亚洲品质自拍| 国产成人精品a视频一区www| 青青青草网站免费视频在线观看| 精品久久久久久中文字幕大豆网| 五月天丁香社区| 亚洲精品美女91| 国产麻豆乱码精品一区二区三区| 欧洲黄色一区| 亚洲国产精品久久91精品| 日本少妇激情视频| 91在线观看污| 99re在线视频免费观看| 国产午夜一区| 国产精品一区二区三区久久| 3d成人动漫在线| 欧美美女bb生活片| 多男操一女视频| 国产精品88888| 欧美亚洲色图视频| 欧美国产极品| 国产精品户外野外| 亚洲第一页视频| 亚洲综合久久久久| 国产二级一片内射视频播放| 国产亚洲激情| 亚洲春色在线视频| 国产亚洲高清一区| 性日韩欧美在线视频| 日韩a在线观看| 欧美日韩大陆一区二区| 538任你躁在线精品视频网站| 国产91丝袜在线播放九色| 欧美 日韩 亚洲 一区| 国产欧美日韩视频在线| 国产日韩在线亚洲字幕中文| 色老头在线观看| 国产视频亚洲精品| 伊人网中文字幕| 亚洲一区在线播放| 蜜臀久久99精品久久久久久| 久久99国产精品久久99| 国产一线二线三线女| 你懂的视频欧美| 91视频国产高清| 手机在线理论片| 久久精品影视伊人网| 免费a级片在线观看| 欧美无乱码久久久免费午夜一区 | 欧美丝袜一区二区三区| 日韩免费av一区| 91在线看国产| 特级西西444www| 久久综合影音| 日本人妻伦在线中文字幕| 啄木系列成人av电影| 91在线直播亚洲| 日韩电影av| 欧美国产日本在线| www.av在线| 亚洲级视频在线观看免费1级| 中文字幕久久熟女蜜桃| 午夜私人影院久久久久| 国产免费一区二区三区四区| 久久色.com| 337p日本欧洲亚洲大胆张筱雨| 日韩高清在线观看| 成人免费视频91| 在线一区电影| 日韩欧美视频一区二区| 久久成人福利| 超碰97人人在线| 日韩伦理一区二区| 国产aaa精品| 女厕盗摄一区二区三区| 欧美夫妻性生活xx| 免费黄色网页在线观看| 日韩精品电影网| 蜜桃av噜噜一区二区三区麻豆| 欧美日韩成人一区| 中文在线免费看视频| 亚洲国产精品久久艾草纯爱| 欧美爱爱免费视频| 国产精品久久久久久久久免费桃花| 久久精品国产亚洲av久| 国产成人精品一区二区三区四区 | 国产a∨精品一区二区三区不卡| 欧美人与牲禽动交com| 欧美成人午夜激情视频| h视频在线免费观看| 日韩视频一区在线| 欧美性天天影视| 日韩在线免费视频观看| 99re热久久这里只有精品34| 国产亚洲xxx| jizz日韩| 日韩在线资源网| 日韩三级影院| 久久偷看各类女兵18女厕嘘嘘| 午夜视频在线免费观看| 日韩在线激情视频| 国内精品不卡| 久久99亚洲精品| 在线中文字幕视频观看| 色综合久久88| 欧美videossex| 91精品国产成人| 一区二区三区电影大全| 日韩美女视频免费看| 户外露出一区二区三区| 国产精品成人va在线观看| 99久久久国产精品免费调教网站| 国产精品视频一区国模私拍| 91国拍精品国产粉嫩亚洲一区| 国产精品第三页| 亚瑟国产精品| 成人动漫视频在线观看免费| 久久综合五月婷婷| 日本日本精品二区免费| 成人在线免费观看网站| 最新精品视频| 国产中文一区| 国产最新免费视频| 日韩国产一区二| 91在线第一页| 99久久精品国产精品久久| 国产jk精品白丝av在线观看| 亚洲国产激情av| 欧美日韩免费一区二区| 精品免费在线观看| 中文字幕第2页| 日韩久久精品一区| 国产免费一级视频| 欧美日韩一区二区三区在线看| 国产乱淫片视频| 亚洲高清色综合| 不卡在线视频| 欧美高清电影在线看| 一个人看的www视频在线免费观看| 国产精品久久久久久久7电影| 国产高清日韩| 久久久久久久有限公司| 外国成人免费视频| 日本www在线视频| 久久av资源站| 91玉足脚交白嫩脚丫| 中文字幕日韩一区| 日韩黄色三级视频| 欧美精品成人一区二区三区四区| 亚洲精品福利网站| 中文字幕欧美国内| 成人在线黄色电影| 国产日韩欧美中文在线播放| 韩国精品福利一区二区三区| 亚洲.欧美.日本.国产综合在线| 欧美色123| 手机在线国产视频| 久久香蕉国产线看观看99| 日韩精品一区二区亚洲av性色| 欧美日韩中文字幕在线视频| 国产aⅴ爽av久久久久成人| 欧美日韩成人一区| 亚洲欧美自偷自拍| 九九热精品在线| 欧美成人毛片| 欧美日韩成人一区二区三区| 欧美人与禽猛交乱配视频| 手机看片福利日韩| 91亚洲午夜精品久久久久久| 欧美日韩人妻精品一区二区三区| 欧美自拍偷拍午夜视频| 日韩有码第一页| 美女黄色丝袜一区| 国产成人精品一区二区三区免费| 国产精品区一区二区三在线播放| 国产精品久久久久久久久久10秀| 欧美伦理片在线看| 91香蕉视频mp4| 国产一级淫片a| 日韩欧美国产一区在线观看| 免费在线观看黄色| 国产精品色视频| 国产乱码精品一区二区三区四区| av在线播放天堂| 成人综合在线网站| 四虎免费在线视频| 3d动漫精品啪啪一区二区竹菊 | 中文字幕不卡在线| 国产精品视频一区在线观看| 日韩av影视综合网| www成人免费观看| 国产三区二区一区久久| 黄色免费成人| 99久久久无码国产精品性波多| 亚洲精品视频一区| 精品久久无码中文字幕| 欧美精品在线视频观看| 精品久久亚洲| 粉嫩av一区二区三区天美传媒| 99久久久成人国产精品| 精品国产乱码91久久久久久网站| 秋霞午夜理伦电影在线观看| 国产精品爽黄69天堂a| 欧美限制电影| 黄色手机在线视频| 中文字幕不卡在线播放| 97人妻精品一区二区三区| 久久精品国产亚洲7777| 久久av网站| 青青在线免费观看| 99久久精品国产导航| 人人草在线观看| 一色桃子一区二区| 亚洲伦理久久| 日本福利视频在线观看| 成人午夜av影视| 一级黄色免费网站| 中国china体内裑精亚洲片| 亚洲天堂网站| 蜜桃网站在线观看| www.欧美亚洲| 亚洲精品久久久久久久蜜桃| 中文字幕av一区中文字幕天堂| 57pao成人永久免费| 91大学生片黄在线观看| 91丨九色丨蝌蚪富婆spa| 亚洲精品毛片一区二区三区| www.国产精品一二区| 999精品视频在这里| 国产午夜福利视频在线观看| 中文文精品字幕一区二区| 国产一区二区视频免费观看| 久久久久国产精品免费网站| 一区二区美女| 在线播放免费视频| 五月婷婷另类国产| 成人激情电影在线看| 7777精品伊久久久大香线蕉语言| 国产欧美成人| 欧美风情第一页| 日韩av影院在线观看| 97精品国产99久久久久久免费| 久久视频免费在线| 久久网这里都是精品| 国产精品女人久久久| 51午夜精品视频| 小说区亚洲自拍另类图片专区| 欧美一区二区中文字幕| 国产亚洲欧美日韩日本| www.国产欧美| 国产精品大片wwwwww| 综合一区在线| 微拍福利一区二区| 欧美va亚洲va| 成人全视频在线观看在线播放高清 | 亚洲国产一区二区三区青草影视| 川上优的av在线一区二区|