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

新來的技術(shù)女總監(jiān),推薦的分布式 ID 真香!

系統(tǒng)
本文分析了幾種常見的分布式 ID 生成方式,具體選用哪種可以根據(jù)自身業(yè)務(wù)而定。

在復(fù)雜的分布式系統(tǒng)中,常常需要一個(gè)全局唯一的 ID來標(biāo)識(shí)數(shù)據(jù),消息或者請(qǐng)求,比如:訂單號(hào),消息的唯一標(biāo)識(shí),接口的冪等ID等等。今天,我們一起來聊聊幾種常見的分布式ID 生成方式。

一、分布式ID具備什么條件?

分布式 ID,通常建議具備以下 4個(gè)條件:

1. 全局唯一

全局唯一,是指在支撐的業(yè)務(wù)范圍內(nèi)能保持全局唯一,這里的全局范圍可大可小,大到成千上萬個(gè)部門的集團(tuán),小到某個(gè)團(tuán)隊(duì)內(nèi)的幾個(gè)系統(tǒng), 所以在設(shè)計(jì)分布式 ID的時(shí)候,一定要清晰地定位受眾范圍。

2. 數(shù)量夠用

分布式ID,一定要保證數(shù)量夠用,通常需要根據(jù)公司具體業(yè)務(wù)來評(píng)估,在一定時(shí)間范圍內(nèi)會(huì)消耗多個(gè)ID, 比如,用于訂單號(hào),需要預(yù)估每年會(huì)產(chǎn)生多少訂單,消耗多少個(gè)訂單號(hào),需要支撐幾年的業(yè)務(wù)使用。

3. 安全性

分布式 ID應(yīng)該是安全的,防止惡意用戶預(yù)測(cè)或推斷出其他ID,如果業(yè)務(wù)對(duì)于這種預(yù)測(cè)不敏感可以忽略。比如,用于接口冪等使用,只要唯一就 ok。

4. 有序性

通常建議分布式 ID具備有序性,方便業(yè)務(wù)排序使用。

二、生成算法

1. UUID

UUID,是 Universally Unique Identifier,通用唯一識(shí)別碼的縮寫,共128-bit(2^128個(gè)),通常表示成 32個(gè)十六進(jìn)制數(shù)字,并且以“-”分隔成五組(8bit-4bit-4bit-4bit-12bit), 比如:62f77d2d-aefe-41ba-b0f8-4c4c39ab670e。

UUID有 5種常見的生成方式,這里總結(jié)了構(gòu)成,用途和特點(diǎn):

(1) 基于時(shí)間戳和 MAC地址

  • 構(gòu)成:基于當(dāng)前時(shí)間戳、時(shí)鐘序列和機(jī)器的MAC地址。
  • 用途:可以確保跨空間(不同機(jī)器)和時(shí)間的唯一性。
  • 特點(diǎn):可能會(huì)暴露生成 UUID的機(jī)器地址和時(shí)間。

Java示例代碼,需要依賴 java-uuid-generator 工具:

import com.fasterxml.uuid.Generators;
public static void generateUUID() {
  UUID uuid = Generators.timeBasedGenerator().generate();
  System.out.println(uuid); // 比如:de02864c-eda8-11ee-a793-dd2f40a50976
}

(2) DCE安全的UUID

  • 構(gòu)成:與方法1類似,但將一部分空間用于包含 POSIX的 UID或 GID。
  • 用途:用于DCE(分布式計(jì)算環(huán)境)的安全性。
  • 特點(diǎn):并不常用,和方法1相似,但提供了額外的用戶或組識(shí)別信息。

(3) 基于名字的MD5散列

  • 構(gòu)成:使用名字空間(Namespace)和特定名字生成 MD5散列。java.util.UUID 提供了這種方式,需要傳入key,使用比較少。
  • 用途:為相同名字生成相同的 UUID,但不同名字空間下的相同名字將生成不同的 UUID。
  • 特點(diǎn):相同輸入產(chǎn)生相同輸出,但由于 MD5容易被破解,不安全,因此現(xiàn)在使用較少。

Java代碼示例:

import java.util.UUID;
public static void generateUUID() {
  String key = "xxxxx"; // 自己指定的key
  UUID uuid3 = UUID.nameUUIDFromBytes(key.getBytes()).toString();
  System.out.println(uuid); // 比如:ea416ed0-759d-36a8-9e58-f63a59077499
}

(4) 隨機(jī)生成

  • 構(gòu)成:使用隨機(jī)數(shù)或偽隨機(jī)數(shù)生成,java.util.UUID 是基于這種方式,使用比較多。
  • 用途:不需要基于時(shí)間或名字,僅需要快速生成UUID。
  • 特點(diǎn):簡(jiǎn)單,沒有時(shí)間順序,不具備可預(yù)測(cè)性。

Java代碼示例:

import java.util.UUID;
public static void main(String[] args) {
  String uuid = UUID.randomUUID().toString();
  System.out.println(uuid); //比如:ea416ed0-759d-36a8-9e58-f63a59077499
}

(5) 基于名字的 SHA-1散列

  • 構(gòu)成:與方法3類似,使用 SHA-1散列算法代替 MD5。
  • 用途:給相同名字生成相同的UUID,通常用于避免 MD5弱點(diǎn)的場(chǎng)景。
  • 特點(diǎn):比方法3的 MD5更安全,但SHA-1目前也已被認(rèn)為不夠安全,比較少使用。

Java代碼示例:

import java.security.MessageDigest;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.UUID;

public static UUID generateUUID(String namespace, String name) {
    try {
        MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
        sha1.update(namespace.getBytes());
        byte[] result = sha1.digest(name.getBytes());

        // Set the version to 5
        result[6] &= 0x0f; // clear version
        result[6] |= 0x50; // set to version 5

        // Set the variant to 2
        result[8] &= 0x3f; // clear variant
        result[8] |= 0x80; // set to IETF variant

        ByteBuffer buffer = ByteBuffer.wrap(result);
        buffer.order(ByteOrder.BIG_ENDIAN);
        returnnew UUID(buffer.getLong(), buffer.getLong());
    } catch (Exception e) {
        thrownew RuntimeException("Unable to generate Version 5 UUID", e);
    }
}
// 使用namespace和name生成Version 5 UUID
UUID uuid5 = generateType5UUID("namespace", "name"); // 比如:c717c842-f1d0-5079-a123-4a86d058c64f

到此,我們對(duì) UUID有了一個(gè)全面的認(rèn)識(shí),最后,總結(jié)下 UUID的優(yōu)缺點(diǎn)以及一些使用建議:

優(yōu)點(diǎn):

  • 生成方式簡(jiǎn)單,各種語言都有成熟的類庫
  • 本地生成,性能高,不依賴網(wǎng)絡(luò)
  • 隨機(jī)機(jī)行強(qiáng),不容被預(yù)測(cè)

缺點(diǎn):

  • 無序,不利于排序,用于 MySQL主鍵時(shí)對(duì)索引不夠友好
  • 32位,字符串太長,存儲(chǔ)需要消耗更多的空間
  • 具體生成 UUID算法的缺點(diǎn)

使用建議:

  • 日常工作為了使用更美觀,一般會(huì)把 UUID中的 “-”去掉
  • 如果對(duì) UUID的缺點(diǎn)沒有任何要求,完全可以采用這種方式來生成分布式 ID,比如,作為接口的冪等ID
  • UUID有重復(fù)的概率,但是幾乎可以忽略不計(jì)

2. ULID

ULID 是 Universally Unique Lexicographically Sortable Identifier的縮寫,它是一種全局唯一、按字典序可排序的標(biāo)識(shí)符。

ULID 由 48-bit的時(shí)間戳 + 80-bit 的隨機(jī)數(shù)組成,時(shí)間戳表示自 1970 年 1 月 1 日 UTC 起的毫秒數(shù),可以支持大約 280 年的時(shí)間范圍。

下面借助三方庫 Sulky ULID 演示如何使用 Java 生成 ULID:

import de.huxhorn.sulky.ulid.ULID;
public class ULIDTest {
    public static void main(String[] args) {
        ULID ulid = new ULID();
        String id = ulid.nextULID();
        System.out.println("ULID: " + id); // 01HTBBBDYK0YMQ8X1Z50QGDH9E
    }
}

最后總結(jié)下 ULID 的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

  • 可排序:ULID  由 48-bit 時(shí)間戳開頭,可以按照生成時(shí)間進(jìn)行排序
  • 高性能:由于 ULID 使用時(shí)間戳和隨機(jī)數(shù),生成速度較快。

缺點(diǎn):

  •  ULID 依賴于時(shí)間戳,極端情況可能會(huì)出現(xiàn)時(shí)間回?fù)軐?dǎo)致 ID沖突

3. 基于 Redis

在 Redis中,可以通過 INCR 和 INCRBY 這樣的自增原子命令,來實(shí)現(xiàn)有序的分布式ID:

下面總結(jié)下 Redis的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

  • 高性能
  • 生成的 ID有序

缺點(diǎn):

  • 需要增加 Redis的成本
  • 強(qiáng)依賴 Redis,因此需要保證 Redis服務(wù)的穩(wěn)定性
  • 生成的ID 有序,對(duì)于敏感業(yè)務(wù),ID容易被預(yù)測(cè)

4. 基于MySQL

通過 MySQL數(shù)據(jù)表的主鍵(int 或 bigint)自增來生成分布式 ID,因此,首先來看看 int 和 bigint 類型支持的數(shù)據(jù)范圍。

int(或 integer):

  • 無符號(hào)的范圍是 0 到 4294967295(42億多)
  • 有符號(hào)的范圍是 -2147483648 到 2147483647

bigint:

  • 無符號(hào)的范圍是 0 到 18446744073709551615
  • 有符號(hào)的范圍是 -9223372036854775808 到 9223372036854775807

假如每天消耗 1億個(gè),使用總年數(shù):18446744073709551615 / 100,000,000 / 365 ≈ 505061753 年。

假如每天消耗 1萬億個(gè),使用總年數(shù):18446744073709551615 / 100,000,000,000,0 / 365 ≈ 50506 年(5萬年)。

使用 MySQL的 bigint,就算業(yè)務(wù)體量每天消耗一萬億個(gè) ID,也需要 5萬年才能消耗完,絕對(duì)夠用。

接下來分析 2種常見生成方式:

(1) MySQL乞丐版

首先,創(chuàng)建一張 distributed_ids表,用于記錄已經(jīng)生成的 ID(如果 ID不想從 1開始,可以在創(chuàng)建表時(shí)給主鍵 ID設(shè)置一個(gè)起始值),表設(shè)計(jì)如下:

CREATE TABLE`distributed_ids` (
`id`BIGINT(20) NOTNULL AUTO_INCREMENT,
`created_at`TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- 或者
CREATETABLE`distributed_ids` (
`id`BIGINT(20) NOTNULL AUTO_INCREMENT,
`created_at`TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT 1000000; -- 1000000可以設(shè)置成具體的

接著,我們需要包裝一個(gè) ID生成的服務(wù)對(duì)外提供給業(yè)務(wù)使用,整體架構(gòu)思路圖如下:

下面為對(duì)外提供服務(wù)核心步驟的 java偽代碼:

@Controller
public class IdGeneratorController {
    @GetMapping("/generateId")
    public Long generateId() {
        Long id = null;
        synchronized (this) {
             // generate id;  sql: UPDATE distributed_ids SET id = id + 1(step);
            // select max id;  sql: SELECT id FROM distributed_ids ORDER BY id desc limit 1;
        }
        return id;
    }
}

到此,一個(gè)簡(jiǎn)單的 ID生成系統(tǒng)就完成了,總結(jié)下該方案的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

  • 實(shí)現(xiàn)簡(jiǎn)單,維護(hù)成本低
  • ID單調(diào)遞增
  • 可以用較少的成本實(shí)現(xiàn)體量較小的業(yè)務(wù)需求

缺點(diǎn):

  • 每次獲取 ID時(shí)候需要進(jìn)行兩次 DB操作
  • 強(qiáng)依賴于 DB,DB性能以及穩(wěn)定性直接影響 ID生成系統(tǒng)的穩(wěn)定性,而且這里有 DB單節(jié)點(diǎn)的風(fēng)險(xiǎn)

對(duì)于缺點(diǎn)中單臺(tái) MySQL存在性能問題,我們自然會(huì)想到增加一臺(tái) MySQL,一臺(tái)使用奇數(shù)自增(1,3,5,7,2n-1),一臺(tái)使用偶數(shù)自增(2,4,6,8,2n),這樣是不是就可以分?jǐn)倝毫α耍咳绻?2臺(tái) MySQL還不夠用,那我們可以使用 N臺(tái),每臺(tái)的初始值依次為 1, 2, 3 … N-1,步長是N(機(jī)器的數(shù)量),整個(gè)架構(gòu)思路圖如下:

仔細(xì)觀察上述架構(gòu)圖可以發(fā)現(xiàn),對(duì)于 MySQL節(jié)點(diǎn)選擇其實(shí)本質(zhì)上是一個(gè) Hash算法,因此,該方案存在 Hash算法典型的缺點(diǎn):水平擴(kuò)容困難,擴(kuò)容時(shí),需要涉及到大量的數(shù)據(jù)遷移。

那么,有沒有一個(gè)更優(yōu)的設(shè)計(jì)方案,既能減少對(duì) DB的操作,又能避免 DB的性能瓶頸?

(2) MySQL號(hào)段版

號(hào)段版是指每次獲取一批 ID(比如 1000,10000),而不是一個(gè) ID,然后在內(nèi)存中去分發(fā)號(hào)段內(nèi)的號(hào)碼。對(duì)此,表結(jié)構(gòu)該如何設(shè)計(jì)呢?

這里我們引入了號(hào)段最大值(max_id) 和步長(step)兩個(gè)概念,max_id是指表中末次獲取號(hào)段時(shí)的最大 ID號(hào),step是指每次獲取多少個(gè) ID。比如,初始值是 1,第一次獲取 1000個(gè)ID,那 max_id=1000, step=1000,第二獲取 1000個(gè)ID,那么 max_id=2000, step=1000,表結(jié)構(gòu)設(shè)計(jì)如下:

-- 號(hào)段 + 步長step
CREATETABLE`distributed_ids` (
`max_id`BIGINT(20) NOTNULL AUTO_INCREMENT,
`step`INT(11) NOTNULL,
`created_at`TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT 1; -- 1可以設(shè)置成具體的起始值

整體架構(gòu)思路圖:

對(duì)于這個(gè)方案中的 step設(shè)置多大比較合理,一般會(huì)參考流量高峰期的是QPS/TPS, 假設(shè)高峰期的 QPS是 1000(1s會(huì)消耗 1000個(gè)ID), 如果想取用一次號(hào)段持續(xù)使用 10分鐘,那么 step=1000 * 60 * 10,即 step是 QPS的 600倍,以此類推, 也可以參考以往業(yè)務(wù)流量分布,確認(rèn)峰值一般會(huì)維持多長時(shí)間,根據(jù)這個(gè)時(shí)間來設(shè)定一個(gè)合理的 step,這樣就可以避免業(yè)務(wù)高峰期頻繁去操作 DB獲取號(hào)段。

總結(jié)下方案的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

  • 一次批量獲取 ID,大大降低了對(duì) MySQL的壓力,比如QPS是 1萬,如果 step設(shè)置為1000, 那么對(duì) MySQL的壓力就從 10000降到 10
  • step可以更具業(yè)務(wù)壓力靈活調(diào)整,可以將此參數(shù)設(shè)置為配置變量

缺點(diǎn)

  • DB不可用導(dǎo)致整個(gè)ID生成系統(tǒng)不可用
  • ID規(guī)律性太強(qiáng),很容易識(shí)別語義,比如,用于訂單號(hào)時(shí),可以根據(jù)某一個(gè)訂單號(hào)輕易地猜測(cè)出其他訂單號(hào)

對(duì)于缺點(diǎn)1,可以采用高可用容災(zāi)方案:主從(一主多從) + 多活(2 地 3活),當(dāng)主節(jié)點(diǎn)掛了,需要將從節(jié)點(diǎn)切換成主節(jié)點(diǎn),當(dāng)機(jī)房A 出現(xiàn)問題, 可以切換到機(jī)房B,這樣充分保證了服務(wù)的高可用,思路看起來簡(jiǎn)單,但實(shí)施起來比較困難,特別是主從切換的時(shí)候,如何保證數(shù)據(jù)一致性是一個(gè)比較大的挑戰(zhàn)。

對(duì)于缺點(diǎn)2,可以采用雪花算法等方案來生成隨機(jī)且遞增的 ID,在下文的三方工具里有很好的實(shí)現(xiàn)。

整個(gè)高可用容災(zāi)方案如下圖:

5. 雪花算法

Snowflake,雪花算法是由 Twitter開源的分布式 ID生成算法,整個(gè)ID包含 64-bit,對(duì)應(yīng) Java的 Long類型,如下圖:

為了更好地說明,本文將 64-bit 分成A, B, C, D 4部分:

  • A部分,占用 1-bit,代表符號(hào)位,其值始終是0
  • B部分,占用 41-bit,代表時(shí)間戳,可表示 2^41 個(gè)數(shù),每個(gè)數(shù)代表毫秒,雪花算法可用的時(shí)間年限大概是 69年。
  • C部分,占用 10-bit,代表機(jī)器數(shù)或者 IDC(數(shù)據(jù)中心)+ 機(jī)器數(shù),如果是機(jī)器數(shù),即 2^10 = 1024 臺(tái)機(jī)器,如果是 IDC+機(jī)器數(shù), 一般 5-bit 用于 IDC(最大 32個(gè)IDC)C,5-bit用于工作機(jī)器(最大 32臺(tái)機(jī)器),這里可以根據(jù)自身業(yè)務(wù)靈活調(diào)整。
  • D部分,占用 12-bit,代表自增序列,可表示 2^12 = 4096個(gè)數(shù)。

基于上述的劃分可以看出,每豪秒能產(chǎn)生 1024 * 4096個(gè)有序不重復(fù)的ID。

最后,總結(jié)下雪花算法的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

  • 本地生成,不依賴數(shù)據(jù)庫等第三方系統(tǒng),穩(wěn)定性高
  • ID是趨勢(shì)遞增,對(duì)于敏感業(yè)務(wù),不具備可預(yù)測(cè)性
  • 可以根據(jù)自身業(yè)務(wù)特性靈活分配 bit位

缺點(diǎn):

  • 強(qiáng)依賴機(jī)器時(shí)鐘,如果時(shí)鐘回?fù)埽赡軙?huì)導(dǎo)致 ID重復(fù)

6. 三方工具

(1) 美團(tuán)的 Leaf

Leaf是美團(tuán)開源的分布式 ID生成工具,它包含 Leaf-segment 和 Leaf-snowflake兩種方案, Leaf-segment是基于 MySQL數(shù)據(jù)庫,它是針對(duì)上述 MySQL方案的更優(yōu)秀設(shè)計(jì),Leaf-snowflake 是基于雪花算法,并且解決雪花算法中時(shí)鐘回?fù)艿膯栴}。

詳情參考官方文檔:https://tech.meituan.com/2017/04/21/mt-leaf.html

(2) 滴滴的TinyID

Tinyid是用Java開發(fā)的一款分布式id生成系統(tǒng),基于數(shù)據(jù)庫號(hào)段算法實(shí)現(xiàn),Tinyid擴(kuò)展了leaf-segment算法,支持了多db(master),同時(shí)提供了java-client(sdk)使id生成本地化,獲得了更好的性能與可用性。

詳情參考官方文檔:https://github.com/didi/tinyid/wiki

(3) 百度-UidGenerator

UidGenerator 百度開源的一款用 Java語言實(shí)現(xiàn),基于 Snowflake算法的唯一ID生成器。包含 DefaultUidGenerator 和 CachedUidGenerator 2種實(shí)現(xiàn)方式:

  • DefaultUidGenerator 是基于時(shí)間戳和機(jī)器位還有序列號(hào)的生成方式,和雪花算法很相似,對(duì)于時(shí)鐘回?fù)芤仓皇菕伄惓L幚怼H有一些不同,如以秒為為單位而不再是毫秒和支持Docker等虛擬化環(huán)境。
  • CachedUidGenerator 是使用 RingBuffer 緩存生成的id。數(shù)組每個(gè)元素成為一個(gè)slot。RingBuffer容量,默認(rèn)為Snowflake算法中sequence最大值(2^13 = 8192)。可通過 boostPower 配置進(jìn)行擴(kuò)容,以提高 RingBuffer 讀寫吞吐量。

詳情參考官方文檔:https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md

三、總結(jié)

本文分析了幾種常見的分布式 ID生成方式,具體選用哪種可以根據(jù)自身業(yè)務(wù)而定:

  • UUID簡(jiǎn)單高效,但是無序,如果作為 MySQL的ID主鍵,對(duì)于索引不太友好
  • ULID 很好的解決了UUID無序的問題,極端情況下存在時(shí)間回?fù)軐?dǎo)致ID重復(fù)的風(fēng)險(xiǎn)
  • 基于 Redis生成的 ID有序,性能高,需要引入和維護(hù) Redis
  • MySQL 乞丐版,實(shí)現(xiàn)簡(jiǎn)單,但是不適合大流量的場(chǎng)景
  • MySQL 號(hào)段版,適合大流量的場(chǎng)景,但是,當(dāng) MySQL主節(jié)點(diǎn)故障時(shí),主從切換需要保持?jǐn)?shù)據(jù)的一致性
  • 雪花算法,有序且不易預(yù)測(cè),算法很優(yōu)秀,不過需要解決時(shí)鐘回?fù)艿膯栴}
  • 三方工具,經(jīng)過生產(chǎn)環(huán)境的考驗(yàn),是很不錯(cuò)的方式,如果不想重復(fù)造輪子,優(yōu)先推薦該方式
責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2024-09-18 00:00:10

UUID識(shí)別碼標(biāo)志符

2022-03-24 07:51:27

seata分布式事務(wù)Java

2022-06-16 07:31:15

MySQL服務(wù)器服務(wù)

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2023-07-26 00:46:25

GitMain主分支

2020-02-13 08:08:23

禁止使用Lombok

2020-02-12 14:03:25

實(shí)用Java工具

2024-01-10 08:02:03

分布式技術(shù)令牌,

2025-04-30 10:44:02

2024-10-09 14:14:07

2020-07-15 16:50:57

Spring BootRedisJava

2023-10-26 18:10:43

分布式并行技術(shù)系統(tǒng)

2024-01-08 08:05:08

分開部署數(shù)據(jù)體系系統(tǒng)拆分

2017-07-01 16:02:39

分布式ID生成器

2019-06-19 15:40:06

分布式鎖RedisJava

2024-01-09 08:00:58

2019-09-05 13:06:08

雪花算法分布式ID

2023-03-05 18:23:38

分布式ID節(jié)點(diǎn)

2019-05-13 09:20:02

京東云RedisMongoDB

2014-11-19 10:12:29

Java分布式緩存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品国产一区二区三区四区在线观看 | 亚洲精品mv在线观看| www.久久热.com| 老司机午夜精品| 色综合久久悠悠| 国产激情在线免费观看| 在线观看亚洲精品福利片| 亚洲人精品午夜| 久久免费视频1| 国产精品xxxxxx| 欧美精品色网| 亚洲性线免费观看视频成熟| 最好看的中文字幕| 欧洲成人一区| 亚洲777理论| 亚洲一区二区精品在线| 手机av免费在线观看| 九九视频精品免费| 日韩女在线观看| 黄色一级片在线免费观看| 国产成人调教视频在线观看 | 欧美高清电影在线| 国产成人免费xxxxxxxx| 国产精品久久久久久婷婷天堂 | 一本一道久久a久久精品| 国产免费色视频| 国产色a在线| hitomi一区二区三区精品| 国产在线视频不卡| 久久久久久无码精品大片| 在线观看一区| 久久国产精品久久久久| 毛片aaaaaa| 精品国产aⅴ| 日韩极品精品视频免费观看| 性高潮久久久久久| 日本成人在线网站| 欧美三级蜜桃2在线观看| 欧美 日韩 激情| 免费网站在线观看人| 亚洲精品亚洲人成人网在线播放| 亚洲激情图片| 国产一级网站视频在线| 91亚洲国产成人精品一区二区三| 粉嫩高清一区二区三区精品视频| 国产口爆吞精一区二区| 蓝色福利精品导航| 国产欧美精品一区二区三区-老狼| 国产黄网在线观看| 99精品国产一区二区青青牛奶| 欧美日韩电影在线观看| 欧美又粗又大又长| 午夜欧美理论片| 欧美成人h版在线观看| 三上悠亚作品在线观看| 91精品动漫在线观看| 久热精品视频在线观看一区| 啪啪一区二区三区| 国产精品7m凸凹视频分类| zzijzzij亚洲日本成熟少妇| 2014亚洲天堂| 你懂的国产精品| 欧美日产国产成人免费图片| av资源吧首页| 国产精品日本| 国产精品福利无圣光在线一区| 天堂免费在线视频| 久久99精品一区二区三区三区| 国产一区玩具在线观看| av av片在线看| 成人精品免费看| 狠狠久久综合婷婷不卡| 蜜桃视频在线免费| 国产精品女同一区二区三区| 久久av喷吹av高潮av| 18加网站在线| 第一福利永久视频精品| 日本999视频| 亚洲欧洲二区| 亚洲精品在线免费观看视频| 毛片网站免费观看| 久久精品不卡| 欧美激情伊人电影| 国产精品久久久久久久久夜色| 日本中文字幕一区二区有限公司| 国产一区私人高清影院| 黑人精品一区二区三区| 久久九九久精品国产免费直播| 一区二区三区四区视频在线观看| 宅男在线观看免费高清网站| 色综合视频在线观看| 久久人人爽av| 神马香蕉久久| 久久精品国产电影| 亚洲高清毛片一区二区| 精品系列免费在线观看| 精品久久一区二区三区蜜桃| 尤物网址在线观看| 五月婷婷综合激情| 欧美日韩精品区别| 亚洲免费福利一区| 欧美大片va欧美在线播放| 毛片视频网站在线观看| 老汉av免费一区二区三区| 久久国产主播精品| 91高清在线观看视频| 欧美怡红院视频| 在线xxxxx| 中文精品久久| 国产精品久久久久久搜索| 天堂成人在线视频| 亚洲欧美偷拍另类a∨色屁股| 成人久久久久久久久| 看亚洲a级一级毛片| 在线午夜精品自拍| 男人的天堂一区| 国产乱人伦精品一区二区在线观看| 欧美日韩大片一区二区三区 | 亚洲免费av观看| 欧美伦理视频在线观看| 成人偷拍自拍| 欧美成人免费一级人片100| 国产字幕在线观看| 99re8在线精品视频免费播放| 日韩中文在线字幕| 欧美午夜三级| 亚洲精品电影在线观看| 精品无码av在线| 国产在线播精品第三| 亚洲欧美国产精品桃花| 成人影院入口| 日韩精品视频中文在线观看| 久久久久久久极品内射| 国产一区二区调教| 中文字幕中文字幕一区三区| 88xx成人网| 揄拍成人国产精品视频| 国内免费精品视频| 99在线精品一区二区三区| 国产成人永久免费视频| 亚洲一区二区三区日本久久九| 久久国产精品亚洲| 国产精品探花视频| 国产精品成人免费| 一级黄色免费毛片| 午夜欧美精品| 黄色91av| 最近高清中文在线字幕在线观看1| 亚洲电影第1页| 青青草av在线播放| xf在线a精品一区二区视频网站| 无码人妻精品一区二区三区在线| 久久97久久97精品免视看秋霞| 久久久久久网站| 天天躁日日躁狠狠躁伊人| 天天综合色天天| 在线免费观看成年人视频| 久久精品毛片| 亚洲aⅴ天堂av在线电影软件| 福利一区二区三区视频在线观看 | 天天操天天摸天天舔| 免费看欧美女人艹b| 熟女熟妇伦久久影院毛片一区二区| 四虎永久精品在线| 精品中文字幕在线| 午夜国产在线观看| 在线视频国内自拍亚洲视频| 男女男精品视频网站| 国产乱码精品1区2区3区| 女人帮男人橹视频播放| 希岛爱理av免费一区二区| 国产精品成av人在线视午夜片| 在线观看黄av| 日韩欧美中文字幕制服| 日产电影一区二区三区| 国产欧美视频一区二区| 九九九九九九九九| 最新亚洲视频| 神马影院午夜我不卡影院| www一区二区三区| 97视频在线看| a√在线中文网新版址在线| 欧美一区二区三区视频在线 | 国产一二区在线观看| 欧美成人bangbros| 一级特黄免费视频| 夜夜亚洲天天久久| 一色道久久88加勒比一| 国产成人综合视频| 久久国产色av免费观看| 91不卡在线观看| 日本不卡一二三区| 91精品入口| 国产精品久久久久影院日本| 欧美videosex性欧美黑吊| 亚洲性猛交xxxxwww| 亚洲春色一区二区三区| 欧美在线不卡视频| 91蜜桃视频在线观看| 成人免费在线观看入口| 亚洲自拍偷拍一区二区| 国产一二三精品| 国产又猛又黄的视频| 精品动漫3d一区二区三区免费| 日韩欧美亚洲在线| 欧美1区二区| 成人激情视频网| 日韩影片中文字幕| 久久久久久成人| 麻豆传媒视频在线| 亚洲天堂色网站| 天堂在线观看免费视频| 日韩手机在线导航| 一区二区三区日| 色综合 综合色| 日韩av在线播放观看| 亚洲欧美激情一区二区| 99国产精品免费| 久久久久久久国产精品影院| 在线xxxxx| 国产成人综合网| 青娱乐国产精品视频| 精品一二三四区| www.激情小说.com| 久久激情婷婷| 成年人视频网站免费观看| 国产综合亚洲精品一区二| 中文字幕第一页亚洲| 欧美激情成人| 亚洲精品高清视频| 国产麻豆精品久久| 欧美日韩国产精品一卡| 欧美五码在线| 精品免费一区二区三区蜜桃| 国产成人澳门| 国产精选在线观看91| 精品三级久久久| 91免费高清视频| aa亚洲一区一区三区| 成人性生交大片免费观看嘿嘿视频| 日本一区二区电影| 国产精品一区二区性色av| 中文字幕系列一区| 国产乱人伦真实精品视频| 成人在线观看免费播放| 国产精品一区二区久久国产| 欧美日韩在线精品一区二区三区激情综合| 欧美怡春院一区二区三区| 成人影院入口| 国产精品美女久久久久av超清| 韩国女主播一区二区| 国产精品男人爽免费视频1| av成人亚洲| 91色在线视频| 欧美区一区二区| 国产精品免费区二区三区观看| 亚洲精品a区| 久久av免费一区| 国产欧美日韩| 在线丝袜欧美日韩制服| 午夜亚洲福利| 日韩国产一级片| 久久久国产精品一区二区中文| 91av俱乐部| 极品少妇一区二区三区精品视频| 精品人妻一区二区三| 波多野结衣中文字幕一区二区三区| 中文字幕 亚洲一区| 国产无人区一区二区三区| 美国精品一区二区| 亚洲伊人伊色伊影伊综合网| 99久久精品国产亚洲| 欧美色窝79yyyycom| 国产视频www| 亚洲国产精品热久久| 高清av在线| 久久99国产精品久久久久久久久| segui88久久综合| 国产91久久婷婷一区二区| 亚洲成人1区| 精品产品国产在线不卡| 欧美色网址大全| 久久手机在线视频| 日本不卡一区二区三区| 超碰91在线播放| 久久日韩精品一区二区五区| 久久国产高清视频| 精品magnet| 一区二区三区日| 亚洲美女av电影| jizzjizz亚洲| 日本国产欧美一区二区三区| 国产日韩欧美中文在线| 欧美日韩中文国产一区发布| 欧美一区高清| 国产自偷自偷免费一区 | 国产精品一区视频| 日韩三级在线| 自慰无码一区二区三区| 国产一区欧美一区| 国产高潮呻吟久久| 欧美日韩国产激情| 国产精品视频一区二区三区,| 亚洲美女视频网站| 激情图片在线观看高清国产| 国产日韩欧美视频| 蜜臀91精品国产高清在线观看| 中文字幕色呦呦| 久久99精品久久只有精品| 国产美女喷水视频| 亚洲成人自拍一区| 国产男男gay网站| 中文字幕亚洲第一| 中文字幕在线视频网站| 岛国视频一区| 中文一区一区三区免费在线观看| 国产免费又粗又猛又爽| 91网页版在线| 国产真人真事毛片| 欧美一二三四区在线| 日韩黄色影院| 国产精品久久视频| 国产成人影院| 欧美三级午夜理伦三级| 99久久夜色精品国产网站| 久久久久久国产精品免费播放| 欧美一区二区视频网站| 色网站在线看| 国产三级精品网站| 日韩欧美一区二区三区免费看| 国产av无码专区亚洲精品| 99久久免费国产| 91香蕉在线视频| 欧美精品一区二区久久婷婷| 色呦呦视频在线观看| 成人羞羞视频免费| 国内精品久久久久久久97牛牛| 一区二区久久精品| 亚洲免费观看高清完整版在线观看| 一本一道精品欧美中文字幕| 中文字幕亚洲专区| 欧美a一级片| 中文字幕在线亚洲三区| 国产乱码精品一区二区三区av| 91成人福利视频| 日韩美女视频在线| 99在线视频影院| 国产一区精品在线| 香蕉亚洲视频| av电影在线不卡| 欧美三级电影在线看| 视频免费一区| av电影成人| 1024日韩| 波多野吉衣中文字幕| 欧美色涩在线第一页| 欧美黄色激情| 99在线看视频| 国产日韩一区二区三区在线| 丰满少妇高潮一区二区| 欧美在线观看你懂的| av黄在线观看| 国产精品一 二 三| 久久av在线| 日韩av网站在线播放| 日韩一级完整毛片| 午夜影院在线观看国产主播| 日韩高清国产精品| 国内一区二区在线| 日韩精品在线免费看| 国产亚洲视频在线| 精品久久亚洲| 久久国产乱子伦免费精品| 日韩一区精品| 日韩电影在线观看中文字幕| 三妻四妾完整版在线观看电视剧| 欧洲久久久久久| 精品一区中文字幕| 国产午夜视频在线播放| 国产香蕉一区二区三区在线视频 | 亚洲一区二区毛片| 成人做爰69片免网站| 日韩欧美在线不卡| 中文字幕在线视频久| 午夜啪啪福利视频| av激情综合网| 国产又黄又大又爽| 69**夜色精品国产69乱| 四季av一区二区凹凸精品| 中文字幕在线视频播放| 欧美日韩精品久久久| av老司机在线观看| 伊人久久大香线蕉av一区| 国产91精品一区二区麻豆网站| 日韩电影在线观看一区二区| 久久97久久97精品免视看| 欧美色图一区| 三叶草欧洲码在线| 日韩一级欧美一级| 国产一区一一区高清不卡|