精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

av中文字幕网址| 欧美另类一区| 国产无套粉嫩白浆内谢| 香蕉精品久久| 欧美视频在线一区二区三区 | 国产美女三级无套内谢| 黄色成人在线网址| 亚洲欧美中文在线视频| 中文字幕亚洲影院| 国产精品高颜值在线观看| 久久综合久久综合亚洲| 成人精品久久av网站| 亚洲精品视频在线观看免费视频| 日韩精品一卡| 日韩电影网在线| 亚洲一区二区三区四区五区xx| 国产激情在线视频| 久久久精品国产免费观看同学| 亚洲在线一区二区| 色老头一区二区| 欧美日韩调教| 久久韩国免费视频| 一本色道久久综合亚洲精品图片| 99热播精品免费| 午夜在线成人av| 超碰在线免费观看97| 黄色片在线播放| av网站一区二区三区| 91免费在线视频网站| 中文字幕在线天堂| 日韩一级精品| 欧美日韩国产123| 婷婷综合在线视频| 免费黄色成人| 日韩成人在线视频观看| 久久黄色一级视频| 国产精品99久久免费| 色噜噜夜夜夜综合网| 欧美一级视频免费看| 羞羞视频在线免费国产| 亚洲欧洲日本在线| 日韩欧美视频一区二区三区四区| 神马久久久久久久久久| 丁香天五香天堂综合| 亚洲自拍av在线| 国产日韩精品suv| 久久国产精品第一页| 国产精品三级在线| 少妇无套内谢久久久久| 视频一区二区三区中文字幕| 9.1国产丝袜在线观看| 国产在线视频你懂的| 午夜精品偷拍| 欧美丰满老妇厨房牲生活| 亚洲av无码一区二区三区在线| 色婷婷综合网| 久久久999精品免费| www.av免费| 欧美黄色一级视频| 日韩中文字幕精品| 暗呦丨小u女国产精品| 国产精品成人a在线观看| 日韩在线视频免费观看| 午夜精品久久久久99蜜桃最新版 | 国产亚洲精品一区二555| av在线网站观看| 精品国产精品国产偷麻豆| 亚洲最新视频在线| 五月婷婷综合激情网| 国产精品麻豆久久| 欧美激情精品久久久久久| 久久久久香蕉视频| 国产一区二区你懂的| 国产999在线观看| 波多野结衣一二区| 久久国产麻豆精品| av一区二区三区在线观看| 黑人乱码一区二区三区av| 99精品视频在线观看免费| 欧美三级华人主播| 欧美成人三区| 亚洲高清免费观看高清完整版在线观看 | 亚洲成人动漫一区| 国产成人无码av在线播放dvd| 8av国产精品爽爽ⅴa在线观看| 欧美日韩国产综合一区二区三区| 国产探花在线观看视频| 青青视频一区二区| 色老头一区二区三区在线观看| 欧美色图亚洲视频| 国产精品女主播一区二区三区| 国产精品黄页免费高清在线观看| 国产一区二区三区四区视频| 成人免费视频网站在线观看| 日本免费高清不卡| av网址在线| 91国产免费看| 女女调教被c哭捆绑喷水百合| 亚洲v天堂v手机在线| www国产精品视频| 91午夜视频在线观看| 蜜桃视频一区二区三区在线观看| 97夜夜澡人人双人人人喊| 青青草在线视频免费观看| 日韩码欧中文字| 成熟了的熟妇毛茸茸| 中文成人激情娱乐网| 日韩精品极品在线观看播放免费视频| 免费91在线观看| 国产农村妇女精品一二区| 91精品国产自产在线| 四虎在线观看| 亚洲综合av网| 黄色一级片免费的| 天海翼精品一区二区三区| 欧美成人午夜影院| 亚洲性猛交富婆| 91美女片黄在线| 国产一级不卡视频| 24小时成人在线视频| 亚洲女成人图区| 日本中文字幕在线免费观看| 国产真实乱偷精品视频免| 欧洲精品久久| 婷婷电影在线观看| 亚洲第一区第二区| 欧美成人黄色网| 国精产品一区一区三区mba桃花| 青娱乐国产91| 伊人久久综合一区二区| 欧美成人三级电影在线| 日本中文字幕免费在线观看| 麻豆国产欧美日韩综合精品二区| 欧洲av一区| videos性欧美另类高清| 日韩大陆毛片av| 日韩经典在线观看| 成人精品鲁一区一区二区| 99re8这里只有精品| 亚洲一区有码| 久久精品亚洲一区| 国产又粗又猛又色又| 中文一区二区在线观看| 网站一区二区三区| 成人免费av| 国产精品久久久久久久久久久久久久 | 国产精品欧美亚洲| 中文字幕乱码日本亚洲一区二区| 国产成人手机视频| 不卡av一区二区| 国产精品人成电影| 免费网站黄在线观看| 在线播放日韩导航| 久草网站在线观看| 成人综合激情网| 水蜜桃色314在线观看| 免费看成人人体视频| 6080yy精品一区二区三区| 天堂av在线播放| 在线视频综合导航| 肉色超薄丝袜脚交69xx图片| 国产久卡久卡久卡久卡视频精品| 9l视频自拍9l视频自拍| 一区二区精彩视频| 久久久中文字幕| 偷拍自拍在线视频| 在线亚洲一区二区| 欧美老熟妇一区二区三区| 国产麻豆9l精品三级站| 日本中文字幕在线视频观看| 牛牛精品成人免费视频| 国产91色在线免费| 91社区在线高清| 日韩一区二区精品| 国产精品老女人| 日本一区二区不卡视频| 手机在线播放av| 亚欧美中日韩视频| 一区二区三区四区不卡| 中文在线综合| 国产成人精品日本亚洲| 国产丝袜在线| 日韩精品亚洲精品| 亚洲天堂中文网| 性感美女极品91精品| 少妇av片在线观看| 国产福利一区在线| 欧美一区二区福利在线| 日韩精品一区二区三区电影| 国产精品极品| 国产精品视频在线播放| 婷婷丁香在线| 亚洲欧美在线一区| 精品国产无码一区二区三区| 精品久久久久久久中文字幕| 欧美成人久久久免费播放| 成人毛片老司机大片| 国产区二区三区| 一区福利视频| 亚洲综合视频一区| 秋霞在线一区| 91久久精品久久国产性色也91| 女海盗2成人h版中文字幕| 色老头一区二区三区| 少妇高潮一区二区三区69| 在线不卡的av| 秋霞av一区二区三区| 夜夜亚洲天天久久| 超碰人人干人人| eeuss影院一区二区三区| 亚洲欧美日本一区二区三区| 国产精品综合| 免费网站在线观看视频| 国产精品国产一区| 日韩电影免费观看高清完整| 国产精品网在线观看| 成人亚洲激情网| av一区在线播放| 日本成熟性欧美| 超碰中文在线| 欧美裸体男粗大视频在线观看| 成av人电影在线观看| 日韩av中文字幕在线播放| 精品人妻久久久久一区二区三区| 欧美日韩国产123区| 无码人妻精品一区二区三区蜜桃91 | 欧美影视资讯| 欧美一区二区三区艳史| 欧美一卡二卡| 色综合91久久精品中文字幕| 好吊日视频在线观看| 正在播放国产一区| 成人精品一区| 国产亚洲欧美日韩精品| 精品av中文字幕在线毛片 | 先锋资源av在线| 国产suv精品一区二区883| 四虎成人在线播放| 狠狠色丁香九九婷婷综合五月| 欧美特级aaa| 欧美96一区二区免费视频| 熟妇人妻无乱码中文字幕真矢织江| 国产精品亚洲综合色区韩国| 国产成人精品视频免费看| 99热免费精品| 激情五月开心婷婷| 久久九九电影| 亚洲天堂网一区| 久热成人在线视频| 999久久久精品视频| 精品一区二区在线看| 亚洲精品在线视频播放| 国产一区在线观看视频| 国产欧美激情视频| 国产成人av网站| 国产精品扒开腿做爽爽爽a片唱戏| 成人小视频在线| 亚洲天堂资源在线| 久久久久久影视| 色www亚洲国产阿娇yao| 亚洲欧洲性图库| 国产一级片免费看| 欧美日韩免费区域视频在线观看| 国产三级av片| 欧美午夜电影网| 国产女人18毛片水真多| 亚洲а∨天堂久久精品喷水| 五月婷婷六月丁香| 国产一区二区三区直播精品电影 | 欧美激情第6页| 忘忧草在线影院两性视频| 国产精品久久久亚洲| 精品国产亚洲一区二区三区在线| 99久久精品免费看国产一区二区三区| 好吊妞视频这里有精品| 日本高清不卡一区二区三| 999国产精品| 三上悠亚久久精品| 日韩—二三区免费观看av| 香蕉视频xxx| 99久久国产免费看| 国产欧美小视频| 亚洲午夜在线视频| 国产九色91回来了| 欧美成人免费网站| 国外av在线| 久久99久久久久久久噜噜| 中文日产幕无线码一区二区| 成人性生交大片免费看小说| 美女午夜精品| 宅男av一区二区三区| 亚洲日本国产| 日本中文字幕二区| 久久网站热最新地址| 免费中文字幕在线| 色老头久久综合| 黄色一级大片在线免费看国产一| 亚洲欧美日韩天堂| 麻豆av在线免费观看| 国产一区二区香蕉| 天堂综合网久久| 日本a在线天堂| 麻豆国产精品视频| jizz日本免费| 亚洲欧美一区二区三区极速播放| www.国产色| 欧美va亚洲va| 国产黄大片在线观看画质优化| 国产97在线|日韩| 另类ts人妖一区二区三区| 四虎免费在线观看视频| 日韩中文欧美在线| 波多野结衣视频播放| 亚洲精品视频在线观看免费| 欧美三级网站在线观看| 亚洲精品资源美女情侣酒店| 亚洲91av| 18成人免费观看网站下载| 爽成人777777婷婷| 成人在线激情网| 91网站在线播放| 国产精品不卡av| 日韩三级免费观看| 日韩在线免费电影| 国产精品电影在线观看| 婷婷综合一区| 欧美日韩一道本| 成人精品电影在线观看| 欧美精品乱码视频一二专区| 91精品啪在线观看国产60岁| 又爽又大又黄a级毛片在线视频| 国产成人a亚洲精品| 神马香蕉久久| 欧美视频在线观看网站| 成人黄色av电影| 精品无码人妻一区二区三| 日韩美女视频在线| 欧洲在线视频| 国产一级特黄a大片99| 亚洲高清久久| 日本护士做爰视频| 激情成人在线视频| 午夜福利一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 国产成人在线中文字幕| av在线播放亚洲| 99re热视频精品| 中文字幕激情小说| 亚洲欧美精品一区| 日韩三级影视| 亚洲7777| 国产一区二区免费看| 国产女人18水真多毛片18精品| 91精品久久久久久久91蜜桃| jizzjizz亚洲| 懂色一区二区三区av片| 18成人免费观看视频| 国产中文字幕一区二区| 日本道免费精品一区二区三区| www.视频在线.com| 国产精品网址在线| 欧美a级一区| japanese在线观看| 日本韩国欧美在线| 男人天堂手机在线| 99九九电视剧免费观看| 99人久久精品视频最新地址| 色欲av无码一区二区三区| 欧美亚洲动漫制服丝袜| 色婷婷av在线| 欧美二级三级| 国内精品伊人久久久久av影院| 久一区二区三区| 亚洲天堂影视av| 国产亚洲久久| 两根大肉大捧一进一出好爽视频| 国产丝袜在线精品| 精品人妻午夜一区二区三区四区| 性欧美xxxx视频在线观看| 欧美精选视频在线观看| 日韩av福利在线观看| 精品日韩视频在线观看| 色大18成网站www在线观看| 国产亚洲第一区| 蜜桃精品视频在线| 久久久久久久伊人| 色老头一区二区三区| 久久影院资源站| 在线一区二区不卡| 色婷婷久久久久swag精品| 黄色网页在线看| 欧美精品一区二区三区在线四季| 精品一区二区三区不卡| 草久视频在线观看| 久久精品国产亚洲| 久操成人av| 中文字幕99页| 91.com视频| 日韩中文影院| 成年人午夜视频在线观看|