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

搞定了六種分布式ID,分庫分表哪個適合做主鍵?

數據庫 其他數據庫
我們介紹了 ShardingSphere 的幾種內置主鍵生成策略以及如何自定義主鍵生成策略,市面上還有許多優秀的分布式ID框架都可以整合進來,但具體選擇何種策略還是要取決于自身的業務需求。

今天咱們繼續一起來探究下,分布式ID在分庫分表中起到的作用以及如何使用,ShardingSphere-jdbc中已經為我們提供了多種分布式主鍵ID生成策略。接下來將分別介紹這些策略的優缺點,看看它們在實際應用中的場景和效果。

圖片圖片

小富技術站:https://xiaofucode.com

為什么用分布式主鍵ID

在傳統的單庫單表結構時,通常可以使用自增主鍵來保證數據的唯一性。但在分庫分表的情況下,每個表的默認自增步長為1,這導致了各個庫、表之間可能存在重疊的主鍵范圍,從而使得主鍵字段失去了其唯一性的意義。

為了解決這一問題,我們需要引入專門的分布式 ID 生成器來生成全局唯一的ID,并將其作為每條記錄的主鍵,以確保全局唯一性。通過這種方式,我們能夠有效地避免數據沖突和重復插入的問題,從而保障系統的正常運行。

除了滿足唯一性的基本要求外,作為主鍵 ID,我們還需要關注主鍵字段的數據類型、長度對性能的影響。因為主鍵字段的數據類型、長度直接影響著數據庫的查詢效率和整體系統性能表現,這一點也是我們在選方案時需要考慮的因素。

內置算法

在ShardingSphere 5.X版本后進一步豐富了其框架內部的主鍵生成策略方案。此前僅提供了UUID和Snowflake兩種策略,現在又陸續提供了NanoID、CosId、CosId-Snowflake三種策略。下面我們將逐個的過一下。

注意:SQL中不要主動拼接主鍵字段(包括持久化工具自動拼接的)否則一律走默認的Snowflake策略!!!

ShardingSphere中為分片表設置主鍵生成策略后,執行插入操作時,會自動在SQL中拼接配置的主鍵字段和生成的分布式ID值。所以,在創建分片表時主鍵字段無需再設置 自增 AUTO_INCREMENT。同時,在插入數據時應避免為主鍵字段賦值,否則會覆蓋主鍵策略生成的ID。

CREATE TABLE `t_order` (
  `id` bigint NOT NULL,
  `order_id` bigint NOT NULL,
  `user_id` bigint NOT NULL,
  `order_number` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
  `customer_id` bigint NOT NULL,
  `order_date` datetime DEFAULT NULL,
  `interval_value` varchar(125) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `total_amount` decimal(10,2) NOT NULL,
  PRIMARY KEY (`order_id`) USING BTREE
) ;

UUID

想要獲得一個具有唯一性的ID,大概率會先想到UUID,因為它不僅具有全球唯一的特性使用還簡單。但并不推薦將其作為主鍵ID。

? UUID的無序性。在插入新行數據后,InnoDB無法像插入有序數據那樣直接將新行追加到表尾,而是需要為新行尋找合適的位置來分配空間。由于ID無序,頁分裂操作變得不可避免,導致大量數據的移動。頻繁的頁分裂會導致數據碎片化(即數據在物理存儲上分散分布)。這種隨機的ID分配過程需要大量的額外操作,導致頻繁的對數據進行無序的訪問,導致磁盤尋道時間增加。數據的無序性進一步加劇了數據碎片化,降低了數據訪問效率。

? UUID字符串類型。字符串比數字類型占用更多的存儲空間,對存儲和查詢性能造成較大的消耗;字符串類型的長度可變,可變長度的數據行會破壞索引的連續性,導致索引查找性能下降。

算法類型:UUID

spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:  # 分布式序列算法配置
          # UUID生成算法
          uu-id-gen:
            type: UUID
        tables:
          t_order:  # 邏輯表名稱
            actual-data-nodes: db$->{0..1}.t_order_${0..2} # 數據節點:數據庫.分片表
            database-strategy:  # 分庫策略
              standard:
                sharding-column: order_id
                sharding-algorithm-name: t_order_database_mod
            table-strategy: # 分表策略
              standard:
                sharding-column: order_id
                sharding-algorithm-name: t_order_table_mod
            key-generate-strategy: # 分布式主鍵生成策略
              column: id
              keyGeneratorName: uu-id-gen

NanoID

或許很多人都不熟悉 NanoID,它是一款用類似 UUID 生成唯一標識符的輕量級庫。不過,與 UUID 不同的是 NanoID 生成的字符串ID長度較短,僅為21位。但仍然不推薦將它作為主鍵ID,理由和UUID一樣。

算法類型:NANOID

spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:  # 分布式序列算法配置
          # nanoid生成算法
          nanoid-gen:
            type: NANOID
        tables:
          t_order:  # 邏輯表名稱
            actual-data-nodes: db$->{0..1}.t_order_${0..2} # 數據節點:數據庫.分片表
            key-generate-strategy: # 分布式主鍵生成策略
              column: id
              keyGeneratorName: nanoid-gen

定制雪花算法

雪花算法是比較主流的分布式ID生成方案,在 ShardingSphere 中的Snowflake算法生成的是 Long 類型的 ID,通常作為默認的主鍵生成策略使用。

內置的雪花算法生成的ID主要由時間戳、工作機器IDworkId、序列號sequence三部分組成。

@Override
  public synchronized Long generateKey() {
      ..........
      return ((currentMilliseconds - EPOCH) << TIMESTAMP_LEFT_SHIFT_BITS) | (getWorkerId() << WORKER_ID_LEFT_SHIFT_BITS) | sequence;
  }

定制 Snowflake 算法有三個可配置的屬性:

worker-id:工作機器唯一標識,單機模式下會直接取此屬性值計算ID,默認是0;集群模式下則由系統自動生成,此屬性無效

max-vibration-offset:最大抖動上限值,范圍[0, 4096),默認是1。那么如何理解這個屬性呢?這個屬性是用來控制上邊生成雪花ID中的sequence。通過限制抖動范圍,同一毫秒內生成的ID中引入微小的變化,讓數據更均勻地分散到不同的分片上。

private void vibrateSequenceOffset() {
    sequenceOffset = sequenceOffset >= maxVibrationOffset ? 0 : sequenceOffset + 1;
}

若使用此算法生成值作分片值,建議配置此屬性。此算法在不同毫秒內所生成的 key 取模 2^n (2^n一般為分庫或分表數) 之后結果總為 0 或 1。為防止上述分片問題,建議將此屬性值配置為 (2^n)-1

max-tolerate-time-difference-milliseconds:最大容忍時鐘回退時間(毫秒)。服務器在校對時間時可能會發生時鐘回撥的情況(當前時間回退),由于根據時間戳參與計算ID,這可能導致生成相同的ID,而這對系統來說是不可接受的。

ShardingSphere 雪花算法針對時鐘回撥場景進行了處理,記錄最后一次生成ID的時間 lastMilliseconds,并與回撥后的當前時間 currentMilliseconds 進行比對。如果時間差超過了設置的最大容忍時鐘回退時間,系統將直接拋出異常;如果未超過,則系統會休眠等待兩者時間差的時長,核心原則確保不會發放重復的ID。

@SneakyThrows(InterruptedException.class)
private boolean waitTolerateTimeDifferenceIfNeed(final long currentMilliseconds) {
    if (lastMilliseconds <= currentMilliseconds) {
        return false;
    }
    long timeDifferenceMilliseconds = lastMilliseconds - currentMilliseconds;
    Preconditions.checkState(timeDifferenceMilliseconds < maxTolerateTimeDifferenceMilliseconds,
            "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", lastMilliseconds, currentMilliseconds);
    Thread.sleep(timeDifferenceMilliseconds);
    return true;
}

算法類型:SNOWFLAKE

spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:  # 分布式序列算法配置
          # 雪花ID生成算法
          snowflake-gen:
            type: SNOWFLAKE
            props:
              worker-id: # 工作機器唯一標識
              max-vibration-offset: 1024 # 最大抖動上限值,范圍[0, 4096)。注:若使用此算法生成值作分片值,建議配置此屬性。此算法在不同毫秒內所生成的 key 取模 2^n (2^n一般為分庫或分表數) 之后結果總為 0 或 1。為防止上述分片問題,建議將此屬性值配置為 (2^n)-1
              max-tolerate-time-difference-milliseconds: 10 # 最大容忍時鐘回退時間,單位:毫秒
        tables:
          t_order:  # 邏輯表名稱
            actual-data-nodes: db$->{0..1}.t_order_${0..2} # 數據節點:數據庫.分片表
            key-generate-strategy: # 分布式主鍵生成策略
              column: id
              keyGeneratorName: snowflake-gen

CosId

CosId 是一個高性能的分布式ID生成器框架,Shardingsphere 將其引入到自身的框架內,只簡單的使用了 CosId 算法。但目前親測 5.2.0版本該算法處于不可用狀態!!!我已經給官方提了issue,看看他們咋回復吧。

CosId 框架內提供了 3 種算法:

? SnowflakeId: 單機 TPS 性能:409W/s , 主要解決時鐘回撥問題 、機器號分配問題并且提供更加友好、靈活的使用體驗。

? SegmentId: 每次獲取一段 (Step) ID,來降低號段分發器的網絡IO請求頻次提升性能,提供多種存儲后端:關系型數據庫、Redis、Zookeeper 供用戶選擇。

? SegmentChainId(推薦): SegmentChainId (lock-free) 是對 SegmentId 的增強。性能可達到近似 AtomicLong 的 TPS 性能 12743W+/s。

該算法使用對外提供了兩個屬性:

? id-name:ID 生成器名稱。

? as-string:是否生成字符串類型ID,將 long 類型 ID 轉換成 62 進制 String 類型(Long.MAX_VALUE 最大字符串長度11位),并保證字符串 ID 有序性。

算法類型:COSID

spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:  # 分布式序列算法配置
          # COSID生成算法
          cosId-gen:
            type: COSID
            props:
              id-name: share
              as-string: false
        tables:
          t_order:  # 邏輯表名稱
            actual-data-nodes: db$->{0..1}.t_order_${0..2} # 數據節點:數據庫.分片表
            key-generate-strategy: # 分布式主鍵生成策略
              column: id
              keyGeneratorName: cosId-gen

CosId-Snowflake

CosId-Snowflake 是 CosId 框架內提供的 Snowflake 算法,它的實現原理和上邊的定制版雪花算法類似,ID主要也是由時間戳、工作機器ID、序列號sequence三部分組成。同樣處理了時鐘回撥等問題。

public synchronized long generate() {
    long currentTimestamp = this.getCurrentTime();
    if (currentTimestamp < this.lastTimestamp) {
        throw new ClockBackwardsException(this.lastTimestamp, currentTimestamp);
    } else {
        if (currentTimestamp > this.lastTimestamp && this.sequence >= this.sequenceResetThreshold) {
            this.sequence = 0L;
        }

        this.sequence = this.sequence + 1L & this.maxSequence;
        if (this.sequence == 0L) {
            currentTimestamp = this.nextTime();
        }

        this.lastTimestamp = currentTimestamp;
        long diffTimestamp = currentTimestamp - this.epoch;
        if (diffTimestamp > this.maxTimestamp) {
            throw new TimestampOverflowException(this.epoch, diffTimestamp, this.maxTimestamp);
        } else {
            return diffTimestamp << (int)this.timestampLeft | this.machineId << (int)this.machineLeft | this.sequence;
        }
    }
}

這個算法提供了兩個屬性:

? epoch:固定的起始時間點,雪花ID算法的 epoch 變量值,默認值:1477929600000。用它的目的提高生成的ID的時間戳部分的可讀性、穩定性和范圍限制,使得生成的ID更加可靠和易于管理。

? as-string:是否生成字符串類型ID,將 long 類型 ID 轉換成 62 進制 String 類型(Long.MAX_VALUE 最大字符串長度11位),并保證字符串 ID 有序性。

算法類型:COSID_SNOWFLAKE

spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:  # 分布式序列算法配置
          # cosId-snowflake生成算法
          cosId-snowflake-gen:
            type: COSID_SNOWFLAKE
            props:
              epoch: 1477929600000
              as-string: false
        tables:
          t_order:  # 邏輯表名稱
            actual-data-nodes: db$->{0..1}.t_order_${0..2} # 數據節點:數據庫.分片表
            key-generate-strategy: # 分布式主鍵生成策略
              column: id
              keyGeneratorName: cosId-snowflake-gen

自定義分布式主鍵

上邊咱們介紹了 ShardingSphere 內提供的 5 種生成主鍵的ID算法,這些算法基本可以滿足大部分的業務場景。不過,在某些情況下,我們可能會要求生成的ID具有特殊的含義或遵循特定的規則。ShardingSphere 也支持我們自定義生成主鍵ID,來滿足定制的業務需求。

實現接口

要實現自定義的主鍵生成算法,首先需要實現 KeyGenerateAlgorithm 接口,并實現內部 4 個方法, 其中有兩個方法比較關鍵:

  • ? getType():我們自定義的算法類型,方便配置使用;
  • ? generateKey():處理主鍵生成的核心邏輯,我們可以根據業務需求選擇合適的主鍵生成算法,比如美團的 Leaf、滴滴的 TinyId 等。
@Data
@Slf4j
public class SequenceAlgorithms implements KeyGenerateAlgorithm {

    // 這個方法用于指定我們自定義的算法的類型。它會返回一個字符串,表示所使用算法的類型,方便在配置和識別時使用。
    @Override
    public String getType() {
        // 返回算法類型表示
        return "custom";
    }

    // 這是生成主鍵的核心邏輯所在。在這個方法內部,我們可以根據業務需求選擇合適的主鍵生成算法,比如美團的Leaf、滴滴的TinyId等。這個方法的具體實現會根據所選算法的特點和要求來設計
    @Override
    public Comparable<?> generateKey() {
        return null;
    }

    @Override
    public Properties getProps() {
        return null;
    }
    // 這個方法用于初始化主鍵生成算法所需的資源或配置
    @Override
    public void init(Properties properties) {
    }
}

在引入外部的分布式ID生成器時,應盡量遵循以下原則:

  • ? 全局唯一:必須保證ID是全局性唯一的,基本要求
  • ? 高性能:高可用低延時,ID生成響應要塊,否則反倒會成為業務瓶頸
  • ? 高可用:100%的可用性是騙人的,但是也要無限接近于100%的可用性
  • ? 好接入:要秉著拿來即用的設計原則,在系統設計和實現上要盡可能的簡單

SPI 注冊

通過 SPI 方式加載我們自定義的主鍵算法,需要在 resource/META-INF/services 目錄下創建一個文件,文件名為 org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm,并將我們自定義的主鍵算法的完整類路徑放入文件內,每行一個。在系統啟動時會自動加載到這個文件,讀取其中的類路徑,然后通過反射機制實例化對應的類,完成主鍵算法的注冊和加載。

resource
    |_META-INF
        |_services
           |_org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm

配置使用

上邊完成了自定義算法的邏輯,使用上與其他的算法一致。只需將我們剛剛定義的算法類型 custom 配置上即可。

spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:  # 分布式序列算法配置
          # 自定義ID生成策略
          xiaofu-id-gen:
            type: custom
        tables:
          t_order:  # 邏輯表名稱
            actual-data-nodes: db$->{0..1}.t_order_${0..2} # 數據節點:數據庫.分片表
            key-generate-strategy: # 分布式主鍵生成策略
              column: id
              keyGeneratorName: xiaofu-id-gen

當執行插入操作時,debug 看已經進入到了定義的主鍵算法內了。

圖片圖片

總結

我們介紹了 ShardingSphere 的幾種內置主鍵生成策略以及如何自定義主鍵生成策略,市面上還有許多優秀的分布式ID框架都可以整合進來,但具體選擇何種策略還是要取決于自身的業務需求。關于分布式 ID 生成器,我曾經撰寫過一篇 一口氣說出 9種 分布式ID生成方式,詳細介紹了多種生成器的優缺點,大家可以作為參考。

案例GitHub地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/shardingsphere101/shardingsphere-sequence-algorithm

責任編輯:武曉燕 來源: 程序員小富
相關推薦

2020-11-10 07:44:18

分庫分表生成

2024-11-22 15:32:19

2017-01-11 08:45:31

編程開發ETL

2018-07-03 10:25:22

CentOsUbuntu服務器

2021-06-25 10:35:58

分布式代碼Java

2021-08-02 09:02:27

架構產品優化

2011-04-15 13:18:47

FlashHTML 5

2025-03-24 09:20:00

架構分布式ID開發

2024-09-18 00:00:10

UUID識別碼標志符

2016-01-07 15:03:20

2013-08-13 14:33:17

程序員

2024-11-13 00:57:36

2013-05-31 11:29:06

2013-02-01 11:31:53

Linux桌面系統

2022-07-11 08:16:47

NewSQL關系數據庫系統

2017-07-19 16:25:07

數據庫開發DB分庫主鍵生成策略

2019-08-12 14:22:23

2025-03-24 11:30:05

2024-06-06 08:40:07

2017-07-01 16:02:39

分布式ID生成器
點贊
收藏

51CTO技術棧公眾號

精品国内亚洲2022精品成人| 手机在线观看毛片| 国产精品99一区二区三| 91精品婷婷国产综合久久| 精品国产一区二区三区日日嗨| 国内免费精品视频| 亚洲激情播播| 91久久国产综合久久| 亚洲图片都市激情| 亚洲第一免费视频| 麻豆91精品| 日韩在线观看免费网站| 女同性αv亚洲女同志| 色在线视频观看| 国产欧美日韩久久| 成人免费激情视频| 不卡的免费av| 国产精品最新| 欧美一区二区三区四区在线观看 | 超碰人人爱人人| 丰满肉嫩西川结衣av| 母乳一区在线观看| 久久精品一本久久99精品| 性生交大片免费看l| 欧美成人a交片免费看| 国产精品污www在线观看| 5566中文字幕一区二区| 青娱乐国产盛宴| 香蕉视频一区| 欧美一级欧美一级在线播放| av网站大全免费| 丁香在线视频| 成人深夜视频在线观看| 国产欧美一区二区三区久久| 99免费在线观看| 青青一区二区三区| 亚洲精品久久久久国产| 亚洲天堂av一区二区| 99久久精品免费看国产小宝寻花 | 久久综合精品一区| 91中文字幕在线播放| 夜夜嗨网站十八久久| 久久夜色精品国产| 国产人妻一区二区| 中文字幕久久精品一区二区| 欧美精三区欧美精三区| 欧美精品久久久久久久免费| 成人片在线看| 国产亚洲欧美色| 精品国产免费久久久久久尖叫 | 91精品国产自产| 麻豆国产精品| 91精品国产综合久久婷婷香蕉| 激情五月开心婷婷| www成人免费观看| 亚洲人成网站影音先锋播放| 亚洲图片欧洲图片日韩av| 日本一二三区在线视频| 成人在线综合网| 91在线直播亚洲| 一区二区三区黄色片| 久久深夜福利| 日韩av手机在线观看| 国产欧美日韩另类| 国产精品扒开腿做爽爽爽软件| 国产午夜一区二区| 国产精品成人一区二区三区电影毛片| 国产日韩三级| 精品少妇一区二区三区| 久久久久久国产精品日本| 天堂综合在线播放| 欧美美女直播网站| 992kp快乐看片永久免费网址| cao在线视频| 无吗不卡中文字幕| 欧美变态另类刺激| 在线观看免费视频你懂的| 综合色天天鬼久久鬼色| 在线精品日韩| 亚洲精品久久久久久| 国产精品suv一区二区69| 欧美激情91| 国模吧一区二区三区| 免费在线观看av网址| 激情视频一区| 国产91精品久久久久| 久久久夜色精品| 亚洲美女一区| 日本精品一区二区三区在线| 亚洲天堂男人av| 视频一区二区三区中文字幕| 国产精品视频精品视频| 看黄色一级大片| 美女视频网站久久| 亚洲一区二区三| 亚洲国产精品18久久久久久| 国产一区二区三区高清播放| 国产精品成人一区二区三区 | 亚洲国产电影| 5252色成人免费视频| 进去里视频在线观看| 男女精品视频| 成人免费观看网址| 天天干,夜夜操| 日本一区二区三区久久久久久久久不| 自拍另类欧美| 岛国在线视频网站| 在线观看免费成人| 日本少妇一区二区三区| 老牛影视av一区二区在线观看| 国产成人高清视频| 51精品久久久久久久蜜臀| 欧美激情第四页| 无码国模国产在线观看| 日韩av中文字幕在线播放| 美女被到爽高潮视频| 91久久电影| 91精品国产亚洲| 怡红院成永久免费人全部视频| 国产精品综合久久| 久久婷婷人人澡人人喊人人爽| 91se在线| 一区二区三区免费在线观看| 黄色a级片免费| 日韩精品中文字幕一区二区| 亚洲毛片在线观看| 精品99在线观看| 日本视频中文字幕一区二区三区| 51国产成人精品午夜福中文下载| 男人久久精品| 亚洲中国最大av网站| 在线免费视频a| 国产伦理久久久久久妇女| 伊人久久久久久久久久久久久| 日本天堂中文字幕| 日本午夜精品一区二区三区电影| 国产免费一区二区三区| av网站无病毒在线| 婷婷六月综合网| 国产三级精品三级在线| 伊人精品一区| 九九热精品视频在线播放| 欧美日韩国产三区| 欧美成欧美va| 久久福利视频一区二区| 免费日韩av电影| 国产伦理精品| 欧美xxx久久| 久草视频手机在线| 国产视频一区欧美| 不卡日韩av| 免费在线看黄色| 欧日韩精品视频| 亚洲av无码一区二区三区网址| 亚洲字幕久久| 国产综合色香蕉精品| 阿v免费在线观看| 日韩欧美在线免费| 中文字幕在线看高清电影| 亚洲全部视频| 国产精品乱子乱xxxx| av免费看在线| 宅男在线国产精品| 亚洲伦理一区二区三区| 极品尤物av久久免费看| 亚洲最新免费视频| 久久uomeier| 日韩毛片在线观看| 久久精品视频5| 久久精品在线观看| 亚欧在线免费观看| 色婷婷av一区二区三区丝袜美腿| 91精品国产网站| 你懂得在线网址| 欧美色视频日本高清在线观看| 在线视频 日韩| 亚洲毛片在线| 狼狼综合久久久久综合网| 乱馆动漫1~6集在线观看| 亚洲精品久久久久中文字幕二区| 97人人模人人爽人人少妇| 中文字幕制服诱惑| 国产精品成人免费在线| www.国产福利| 国产精品a久久久久| 成人精品水蜜桃| 国产在线观看www| 亚洲日本成人网| 一级黄色大片免费| 亚洲精品一二三| 国产综合内射日韩久| 欧美日韩岛国| 欧美精品v日韩精品v国产精品| 偷拍精品精品一区二区三区| 在线激情影院一区| 99久久久久成人国产免费| 亚洲小说欧美激情另类| 亚洲小说欧美另类激情| 调教一区二区| 国产一区二区毛片| 久久www视频| 伊人春色精品| 99在线视频播放| 经典三级一区二区| 色综合久久88色综合天天看泰| 午夜视频免费在线| 欧美精品日韩一本| 91精品国产高清一区二区三密臀| 成人欧美一区二区三区小说| 久久久久成人精品无码中文字幕| 日韩激情av在线| 国产成a人亚洲精v品在线观看| 精品久久久久久久久久久aⅴ| 成人免费视频视频在| 成人在线高清| 欧美又大又硬又粗bbbbb| 97影院秋霞午夜在线观看| 亚洲日韩欧美视频一区| 人成网站在线观看| 欧美一区二区三区四区高清| 日本熟妇一区二区三区| 午夜精品久久久| 妺妺窝人体色www婷婷| 国产精品久久久久一区二区三区共| 精品国产人妻一区二区三区| 国产精品69毛片高清亚洲| 国产视频1区2区3区| 久久一区中文字幕| 精品视频在线观看一区| 欧美视频导航| 91精品国产毛片武则天| 国产精品久久观看| 中文字幕精品—区二区四季| 亚洲欧洲一区二区| 国产一区二区精品久| 精品免费视频123区| eeuss国产一区二区三区四区| 91九色精品视频| 欧美天堂在线| 国产色综合天天综合网| ww久久综合久中文字幕| 国产成人精彩在线视频九色| 欧美91看片特黄aaaa| 91精品国产高清久久久久久91| 国产黄色大片在线观看| 欧美激情在线播放| 欧美卡一卡二| 久久久久久成人精品| 欧美草逼视频| 国内精品久久久久影院 日本资源| 免费电影网站在线视频观看福利| 欧美精品一区二区免费| 羞羞电影在线观看www| 欧美成人精品一区二区| 中文字幕中文字幕在线十八区 | 中文视频在线观看| 成人丝袜视频网| 亚洲天堂美女视频| 97精品超碰一区二区三区| 久久国产精品影院| 国产亚洲欧美激情| 久久精品日韩无码| 亚洲猫色日本管| 国产亚洲精品成人| 精品久久久久久久久久久久久| 老熟妇仑乱一区二区av| 欧美亚洲丝袜传媒另类| 亚洲系列第一页| 欧美成人一区二区| 老牛影视av牛牛影视av| 亚洲变态欧美另类捆绑| 久草在现在线| 日韩在线观看网站| 欧美xxxx做受欧美88bbw| 91av在线播放| 国产伊人久久| 99久久精品免费看国产四区| 清纯唯美亚洲经典中文字幕| 色噜噜一区二区| 午夜精品影院| 欧美成人精品欧美一级乱| 久久精品国产久精国产| 少妇伦子伦精品无吗| 久久久久国产精品麻豆ai换脸| 精品国产大片大片大片| 亚洲成人自拍偷拍| 亚洲中文无码av在线| 91精品国产一区二区三区| 天天操天天干天天爽| 亚洲视屏在线播放| 亚洲第一图区| 国产成人精品综合久久久| 久久九九精品视频| 国产精品久久久久精k8| 亚洲天堂网一区二区| 国产精品全国免费观看高清| 日本一本高清视频| 欧美精品在欧美一区二区少妇| 风流老熟女一区二区三区| 亚洲va欧美va天堂v国产综合| 干日本少妇视频| 亚洲精品女人| www.久久91| 成人在线综合网| 国产精品久久国产精麻豆96堂| 性做久久久久久免费观看| 一级黄色免费片| 亚洲另类图片色| 成人性生交大片免费看在线播放| 国产精品久久久久久av福利| 久久这里只有精品一区二区| 日本三级福利片| 日韩av一区二区在线影视| 视频免费在线观看| 亚洲色图视频网站| 国产99久久久久久免费看| 亚洲国产精品字幕| 三级网站视频在在线播放| 国产精品亚洲第一区| 亚洲丝袜啪啪| av免费观看大全| 国产成人亚洲综合a∨婷婷| 99成人在线观看| 欧美日韩一区二区三区在线看| 青青青草原在线| 久久人人爽人人爽人人片av高请 | 深爱五月激情网| 亚洲欧美日韩一区二区| 久久久久亚洲视频| 亚洲精品视频久久| 秋霞伦理一区| 国产精品区二区三区日本| 综合国产精品| 中文字幕国产高清| 国产精品久久久久久妇女6080| 日韩av免费播放| 亚洲无av在线中文字幕| 天堂√8在线中文| 国产一区免费观看| 一区久久精品| 日本少妇xxxx软件| 夜夜精品视频一区二区| www.久久久久久| 久久99精品久久久久久琪琪 | 欧美一区二区三区免费观看视频| 伊人免费在线| 国产一区视频在线| 五月天综合网站| 欧美一区亚洲一区| 91精品国产综合久| 中文字幕少妇一区二区三区| 亚洲伦理影院| 亚洲啪啪av| 狠狠网亚洲精品| 免费无码毛片一区二区app| 日韩一区二区三区视频| 亚洲奶水xxxx哺乳期| 国产精品一区二区三区在线观| 激情综合久久| www.久久av| 欧美亚州韩日在线看免费版国语版| а天堂8中文最新版在线官网| 国产精品中文字幕在线观看| 婷婷伊人综合| 激情综合激情五月| 欧美色图在线视频| 午夜在线播放| 不卡视频一区二区| 久久精品30| 国精产品久拍自产在线网站| 欧美一区二区精品久久911| 大黄网站在线观看| 日韩精品在在线一区二区中文| 美女网站色91| 日本熟妇毛耸耸xxxxxx| 亚洲毛片在线观看| 91成人在线网站| 成年人午夜免费视频| 久久久精品日韩欧美| 国产精品久久欧美久久一区| 久久99精品国产99久久6尤物| 亚瑟一区二区三区四区| xxx国产在线观看| 五月天激情小说综合| 国产精品一二三区视频| 亚洲最大的免费| 亚洲一区图片| 国产美女福利视频| 亚洲国产欧美自拍| 青青久久精品| 国产精品网站免费| 国产精品久久免费看| 姝姝窝人体www聚色窝| 国产精品十八以下禁看| 亚洲三级影院| 翔田千里88av中文字幕| 亚洲女人天堂成人av在线| 午夜精品在线| 国产精品v日韩精品v在线观看| 午夜久久久久久久久久一区二区|